BZOJ 1230: [Usaco2008 Nov]lites 开关灯
线段树裸题
#include<cstdio> #include<algorithm> using namespace std; int n,q,sz0[1000005],sz1[1000005],rev[1000005]; void update(int t){ sz0[t]=sz0[t<<1]+sz0[t<<1|1]; sz1[t]=sz1[t<<1]+sz1[t<<1|1]; } void push_down(int t){ rev[t<<1]^=1,rev[t<<1|1]^=1; swap(sz0[t<<1],sz1[t<<1]),swap(sz0[t<<1|1],sz1[t<<1|1]); rev[t]^=1; } void modify_rev(int t,int l,int r,int x,int y){ if (r<x || l>y) return; if (l>=x && r<=y){ rev[t]^=1; swap(sz0[t],sz1[t]); return; } if (rev[t]) push_down(t); int mid=(l+r)>>1; modify_rev(t<<1,l,mid,x,y); modify_rev(t<<1|1,mid+1,r,x,y); update(t); } int query(int t,int l,int r,int x,int y){ if (r<x || l>y) return 0; if (l>=x && r<=y) return sz1[t]; if (rev[t]) push_down(t); int mid=(l+r)>>1; return query(t<<1,l,mid,x,y)+query(t<<1|1,mid+1,r,x,y); } void build(int t,int l,int r){ if (l==r){ sz0[t]=1; return; } int mid=(l+r)>>1; build(t<<1,l,mid); build(t<<1|1,mid+1,r); update(t); } int main(){ scanf("%d%d",&n,&q); build(1,1,n); while (q--){ int cas,l,r; scanf("%d%d%d",&cas,&l,&r); if (!cas) modify_rev(1,1,n,l,r); else printf("%d\n",query(1,1,n,l,r)); } return 0; }