[TJOI2009]開關 [線段樹水題]
阿新 • • 發佈:2018-12-15
全開就是將區間值變為區間長度減區間值
#include<bits/stdc++.h> #define N 100050 using namespace std; int n,m,tag[N<<2],val[N<<2]; void Pushup(int x){val[x] = val[x<<1] + val[x<<1|1];} void Pushdown(int x,int l,int r){ if(tag[x]){ int mid = (l+r) >> 1; val[x<<1] = (mid-l+1) - val[x<<1]; val[x<<1|1] = (r-mid) - val[x<<1|1]; tag[x<<1] ^= 1; tag[x<<1|1] ^= 1; tag[x] = 0; } } void Update(int x,int l,int r,int L,int R){ if(L<=l && r<=R){ val[x] = (r-l+1) - val[x]; tag[x] ^= 1; return; } Pushdown(x,l,r); int mid = (l+r) >> 1; if(L<=mid) Update(x<<1,l,mid,L,R); if(R>mid) Update(x<<1|1,mid+1,r,L,R); Pushup(x); } int Quary(int x,int l,int r,int L,int R){ if(L<=l && r<=R) return val[x]; Pushdown(x,l,r); int mid = (l+r) >> 1 , ans = 0; if(L<=mid) ans += Quary(x<<1,l,mid,L,R); if(R>mid) ans += Quary(x<<1|1,mid+1,r,L,R); return ans; } int main(){ scanf("%d%d",&n,&m); while(m--){ int op,x,y; scanf("%d%d%d",&op,&x,&y); if(op==0) Update(1,1,n,x,y); if(op==1) printf("%d\n",Quary(1,1,n,x,y)); } return 0; }