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号