1135: [POI2009]Lyz
Description
初始时滑冰俱乐部有1到n号的溜冰鞋各k双。已知x号脚的人可以穿x到x+d的溜冰鞋。 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人。xi为负,则代表走了这么多人。 对于每次操作,输出溜冰鞋是否足够。
Input
n m k d ( 1≤n≤200,000 , 1≤m≤500,000 , 1≤k≤10^9 , 0≤d≤n ) ri xi ( 1≤i≤m, 1≤ri≤n-d , |xi|≤10^9 )
Output
对于每个操作,输出一行,TAK表示够 NIE表示不够。
Sample Input
4 4 2 1
1 3
2 3
3 3
2 -1
1 3
2 3
3 3
2 -1
Sample Output
TAK
TAK
NIE
TAK
TAK
NIE
TAK
http://blog.csdn.net/iamzky/article/details/40707885
1 #include<iostream> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<cstdio> 6 #include<algorithm> 7 #include<string> 8 #include<map> 9 #include<queue> 10 #include<vector> 11 #include<set> 12 #define inf 1000000000 13 #define maxn (200000+5) 14 #define maxm 50+5 15 #define eps 1e-10 16 #define ll long long 17 #define for0(i,n) for(int i=0;i<=(n);i++) 18 #define for1(i,n) for(int i=1;i<=(n);i++) 19 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 20 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 21 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 22 using namespace std; 23 int n,m; 24 ll k,d,xi,yi; 25 struct tree{ 26 int l,r; 27 ll sum,mx,lmax,rmax; 28 }f[maxn*4]; 29 ll read(){ 30 ll x=0,f=1;char ch=getchar(); 31 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 32 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 33 return x*f; 34 } 35 void pushup(int i){ 36 f[i].sum=(f[i*2+1].sum+f[i*2].sum); 37 f[i].lmax=max(f[i*2].lmax,f[i*2].sum+f[i*2+1].lmax); 38 f[i].rmax=max(f[i*2+1].rmax,f[i*2+1].sum+f[i*2].rmax); 39 f[i].mx=max(f[i*2].mx,max(f[i*2+1].mx,f[i*2].rmax+f[i*2+1].lmax)); 40 } 41 42 void update(int i,ll x) 43 { 44 f[i].sum+=x; 45 f[i].lmax+=x; 46 f[i].rmax+=x; 47 f[i].mx+=x; 48 return; 49 } 50 51 void build(int i,int left,int right){ 52 int mid=(left+right)/2; 53 f[i].l=left;f[i].r=right; 54 if(left==right){ 55 f[i].sum=f[i].lmax=f[i].rmax=f[i].mx=-k; 56 return; 57 } 58 build(i*2,left,mid); 59 build(i*2+1,mid+1,right); 60 pushup(i); 61 } 62 63 void add(int i,int left,int right,ll x){ 64 if(left==right){ 65 update(i,x); 66 return ; 67 } 68 int mid=(left+right)>>1; 69 if(mid>=xi)add(i<<1,left,mid,x); 70 else add(i<<1|1,mid+1,right,x); 71 pushup(i); 72 } 73 int main(){ 74 n=read(),m=read(),k=read(),d=read(); 75 n-=d; 76 build(1,1,n); 77 for1(i,m){ 78 xi=read(),yi=read(); 79 add(1,1,n,yi); 80 if(max(f[1].lmax,max(f[1].rmax,f[1].mx))<=d*k)printf("TAK\n"); 81 else printf("NIE\n"); 82 } 83 }