【转】poj 1823
#include<iostream>
#include<fstream>using namespace std;struct e{ int l,r,cnt,cntl,cntr; int state;};e tree[48001];int n,m;void build(int s,int t,int p){ int i,j,k; tree[p].l=s;tree[p].r=t; tree[p].state=-1; tree[p].cnt=tree[p].cntl=tree[p].cntr=t-s+1; if(s==t) return; else { k=(s+t)>>1; build(s,k,2*p); build(k+1,t,2*p+1); }}void godown(int p,int value){ tree[p].state=0; tree[2*p].state=tree[2*p+1].state=value; if(value==-1) { tree[2*p].cnt=tree[2*p].cntl=tree[2*p].cntr=tree[2*p].r-tree[2*p].l+1; tree[2*p+1].cnt=tree[2*p+1].cntl=tree[2*p+1].cntr=tree[2*p+1].r-tree[2*p+1].l+1; } else { tree[2*p].cnt=tree[2*p].cntl=tree[2*p].cntr=0; tree[2*p+1].cnt=tree[2*p+1].cntl=tree[2*p+1].cntr=0; }}void update(int s,int t,int p,int value){ int i,j,k; if(s<=tree[p].l&&tree[p].r<=t) { tree[p].state=value; if(value==-1) { i=tree[p].r-tree[p].l+1; tree[p].cnt=tree[p].cntl=tree[p].cntr=i; } else tree[p].cnt=tree[p].cntl=tree[p].cntr=0; return; } if(tree[p].state==value) return; if(tree[p].state==-value) godown(p,-value); if(t<=tree[p*2].r) update(s,t,2*p,value); else if(s>=tree[2*p+1].l) update(s,t,2*p+1,value); else { update(s,t,2*p,value); update(s,t,2*p+1,value); } if(tree[2*p].state==-1) tree[p].cntl=tree[2*p].cnt+tree[2*p+1].cntl; else tree[p].cntl=tree[2*p].cntl; if(tree[2*p+1].state==-1) tree[p].cntr=tree[2*p+1].cnt+tree[2*p].cntr; else tree[p].cntr=tree[2*p+1].cntr; if(tree[2*p+1].state==tree[2*p].state) tree[p].state=tree[2*p].state; i=tree[2*p].cntr+tree[2*p+1].cntl; j=max(tree[2*p].cnt,tree[2*p+1].cnt); tree[p].cnt=max(max(i,j),k);}void read(){// ifstream cin("in.txt"); int i,j,k,s,t;// cin>>n>>m; scanf("%d%d",&n,&m); build(1,n,1); for(i=1;i<=m;i++) { // cin>>j; scanf("%d",&j); if(j==1) { // cin>>s>>t; scanf("%d%d",&s,&t); update(s,s+t-1,1,1); } else if(j==2) { // cin>>s>>t; scanf("%d%d",&s,&t); update(s,s+t-1,1,-1); } else cout<<tree[1].cnt<<endl; }}int main(){ read(); return 0;}

浙公网安备 33010602011771号