bzoj3226: [Sdoi2008]校门外的区间 线段树
2015-02-21 21:24
267 查看
由于知识最后一次询问,这样简化了操作。
所有操作都可用取并和取交完成。
第一个操作就直接把区间标记为1.
第二个操作就把T左边的区间和T右边的区间取为0。
第三个操作就把T所在区间设为0;
第四个操作把T左边的区间和右边的区间设为0;中间的再取反。
第五个操作直接把T区间取反即可。
所有操作都可用取并和取交完成。
第一个操作就直接把区间标记为1.
第二个操作就把T左边的区间和T右边的区间取为0。
第三个操作就把T所在区间设为0;
第四个操作把T左边的区间和右边的区间设为0;中间的再取反。
第五个操作直接把T区间取反即可。
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> using namespace std; #define n (65536*2+1) #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define getmid int mid=(l+r)>>1 int getint() { int x=0,f=0;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='(')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} if(ch==')')f=1; return x*2-f; } int val[n<<2],tag[n<<2],rev[n<<2]; void build(int l,int r,int rt) { tag[rt]=-1; if(l==r) return ; getmid; build(lson); build(rson); } void pushdown(int l,int r,int rt) { int tmp,cnt; tmp=tag[rt],cnt=rev[rt]; tag[rt]=-1;rev[rt]=0; if(l==r) { if(tmp!=-1) val[rt]=tmp; val[rt]^=cnt; return; } if(tmp!=-1) { tag[rt<<1]=tag[rt<<1|1]=tmp; rev[rt<<1]=rev[rt<<1|1]=0; } rev[rt<<1]^=cnt;rev[rt<<1|1]^=cnt; } void update(int l,int r,int rt,int x,int y,int v) { pushdown(l,r,rt); if(x<=l&&r<=y) { if(v==-1) rev[rt]^=1; else tag[rt]=v; return; } getmid; if(x<=mid) update(lson,x,y,v); if(y>mid) update(rson,x,y,v); } bool query(int l,int r,int rt,int pos) { pushdown(l,r,rt); if(l==r) return val[rt]; getmid; if(pos<=mid) query(lson,pos); else query(rson,pos); } int main() { build(1,1,n); char ch[5]; while(scanf("%s",ch)!=EOF) { int a=getint(),b=getint(); a+=2;b+=2; switch(ch[0]) { case 'U':update(1,n,1,a,b,1);break; case 'I':update(1,n,1,1,a-1,0);update(1,n,1,b+1,n,0);break; case 'D':update(1,n,1,a,b,0);break; case 'C':update(1,n,1,1,a-1,0);update(1,n,1,b+1,n,0);update(1,n,1,a,b,-1);break; case 'S':update(1,n,1,a,b,-1);break; } } int start=-1,last=-1,flag=0; for(int i=1;i<=n;i++) { if(query(1,n,1,i)) { if(start==-1)start=i; last=i; } else { if(start!=-1) { if(flag)printf(" "); else flag=1; if(start&1)printf("("); else printf("["); printf("%d",start/2-1); printf(","); printf("%d",(last+1)/2-1); if(last&1)printf(")"); else printf("]"); } last=start=-1; } } if(!flag)puts("empty set"); return 0; } /* U [1,5] D [3,3] S [2,4] C (1,5) I (2,3] */
相关文章推荐
- BZOJ 题目 3226: [Sdoi2008]校门外的区间(线段树区间交并差异或)
- [bzoj3226][Sdoi2008]校门外的区间——线段树
- bzoj 3226 [Sdoi2008]校门外的区间(线段树)
- [BZOJ]3226: [Sdoi2008]校门外的区间 线段树
- [BZOJ3226][SDOI2008]校门外的区间(线段树)
- bzoj 3226: [Sdoi2008]校门外的区间(线段树)
- [线段树 标记] BZOJ 3226 [Sdoi2008]校门外的区间
- 【SDOI2008】【BZOJ3226】校门外的区间
- BZOJ-3226 [SDOI2008]校门外的区间
- 【BZOJ】【P3226】【Sdoi2008】【校门外的区间】【题解】【线段树】
- 【分块】bzoj3226 [Sdoi2008]校门外的区间
- bzoj 3226: [Sdoi2008]校门外的区间
- BZOJ 3226: [Sdoi2008]校门外的区间
- 3226: [Sdoi2008]校门外的区间 线段树
- BZOJ 3226 [SDOI2008]校门外的区间
- 【bzoj3226】[Sdoi2008]校门外的区间
- 3226: [Sdoi2008]校门外的区间
- 3226: [Sdoi2008]校门外的区间
- 【BZOJ3226】【codevs2297】校门外的区间,线段树
- 「BZOJ3226」[SDOI2008] 校门外的区间(线段树好题)