BZOJ 1230: [Usaco2008 Nov]lites 开关灯

来源:互联网 发布:数据库系统软件 编辑:程序博客网 时间:2024/05/16 17:44

简单线段树,发现对update和pushdown要注意一下

#include<cstdio>#include<algorithm>#define inf 1000000000using namespace std;const int N=100005;int c[4*N];bool rev[4*N];void rever(int x,int l,int r){rev[x]^=1;c[x]=(r-l+1)-c[x];}void pushdown(int x,int l,int r){int lc=x<<1,rc=lc^1,mid=(l+r)>>1;if(rev[x])rev[x]=0,rever(lc,l,mid),rever(rc,mid+1,r);}void change(int x,int l,int r,int ql,int qr){pushdown(x,l,r);int mid=(l+r)>>1,lc=x<<1,rc=lc^1;if(l==ql && r==qr){rever(x,l,r); return;}if(qr<=mid)    change(lc,l,mid,ql,qr);else if(ql>mid)change(rc,mid+1,r,ql,qr);elsechange(lc,l,mid,ql,mid),change(rc,mid+1,r,mid+1,qr);c[x]=c[lc]+c[rc];}int s;void query(int x,int l,int r,int ql,int qr){pushdown(x,l,r);if(l==ql && r==qr){s+=c[x]; return;}int mid=(l+r)>>1,lc=x<<1,rc=lc^1;if(qr<=mid)    query(lc,l,mid,ql,qr);else if(ql>mid)query(rc,mid+1,r,ql,qr);elsequery(lc,l,mid,ql,mid),query(rc,mid+1,r,mid+1,qr);}int main(){int n,m,x,y,a;scanf("%d%d",&n,&m);while(m--){scanf("%d%d%d",&a,&x,&y);if(!a)change(1,1,n,x,y);else {s=0;query(1,1,n,x,y);printf("%d\n",s);}}    return 0;}


1 0
原创粉丝点击