线段树,前缀和最小
| Time Limit: 1000MS | Memory Limit: 65536KB | 64bit IO Format: %I64d & %I64u |
Description
Input
Output
Sample Input
| input | output |
|---|---|
5 -1000 10.09 21:00 +500 09.09 14:00 +1000 02.09 00:00 -1000 17.09 21:00 +500 18.09 13:00 |
-1000 -500 0 -500 -500 |
Source
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long int LL;
const int maxn=110000;
int n;
LL money[maxn];
LL Time[maxn],T[maxn];
LL add[maxn<<2],mx[maxn<<2];
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
void build(int l,int r,int rt)
{
add[rt]=0,mx[rt]=0;
if(l==r) return ;
int m=(l+r)/2;
build(lson); build(rson);
}
void upd_add(int rt)
{
if(add[rt])
{
mx[rt<<1]+=add[rt];
mx[rt<<1|1]+=add[rt];
add[rt<<1]+=add[rt];
add[rt<<1|1]+=add[rt];
add[rt]=0;
}
}
void push_down(int rt)
{
upd_add(rt);
}
void push_up(int rt)
{
mx[rt]=min(mx[rt<<1],mx[rt<<1|1]);
}
void update(int L,int R,int V,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
add[rt]+=V;
mx[rt]+=V;
return ;
}
push_down(rt);
int m=(l+r)/2;
if(L<=m) update(L,R,V,lson);
if(R>m) update(L,R,V,rson);
push_up(rt);
}
int main()
{
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++)
{
char op;
LL mo;
int day,mouth,hh,mm;
scanf("%c%I64d %d.%d %d:%d",&op,&mo,&day,&mouth,&hh,&mm);
money[i]=mo;
if(op==‘-‘) money[i]*=-1;
Time[i]=1LL*(mouth*31+day)*24*60+hh*60+mm;
T[i]=Time[i];
}
sort(T,T+n);
int m=unique(T,T+n)-T;
build(1,n,1);
for(int i=0;i<n;i++)
{
int id=lower_bound(T,T+m,Time[i])-T+1;
update(id,n,money[i],1,n,1);
printf("%I64d\n",mx[1]>=0?0:mx[1]);
}
return 0;
}
URAL 2014 Zhenya moves from parents 线段树
原文:http://www.cnblogs.com/tlnshuju/p/7147556.html