BZOJ 1230: [Usaco2008 Nov]lites 开关灯
2016-09-07 13:32
429 查看
简单线段树,发现对update和pushdown要注意一下
#include<cstdio> #include<algorithm> #define inf 1000000000 using 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); else change(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); else query(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; }
相关文章推荐
- BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )
- bzoj:1230: [Usaco2008 Nov]lites 开关灯
- 【bzoj1230】[Usaco2008 Nov]lites 开关灯
- bzoj 1230: [Usaco2008 Nov]lites 开关灯
- BZOJ1230: [Usaco2008 Nov]lites 开关灯
- bzoj1230 [Usaco2008 Nov]lites 开关灯
- BZOJ 1230: [Usaco2008 Nov]lites 开关灯
- BZOJ 1230: [Usaco2008 Nov]lites 开关灯 线段树
- bzoj 1230: [Usaco2008 Nov]lites 开关灯【线段树】
- BZOJ 1230: [Usaco2008 Nov]lites 开关灯
- bzoj1230[Usaco2008 Nov]lites 开关灯
- bzoj1230[Usaco2008 Nov]lites 开关灯
- 【线段树】Bzoj1230 [Usaco2008 Nov]lites 开关灯
- bzoj1230[Usaco2008 Nov]lites 开关灯 线段树lazy标记
- bzoj1230 : [Usaco2008 Nov]lites 开关灯
- BZOJ1230 [Usaco2008 Nov]lites 开关灯
- bzoj1230 [Usaco2008 Nov]lites 开关灯
- BZOJ 1230 Usaco2008 Nov 开关灯 线段树
- BZOJ 1230 Usaco2008 Nov 开关灯 线段树
- bzoj1230[Usaco2008 Nov]&&[TJOI2009]开关灯(线段树)