3226: [Sdoi2008]校门外的区间
2018-04-17 15:23
399 查看
思路
bug漫天飞。。。
维护一颗线段树,支持区间赋值,和区间异或。因为会处理到一些方括号还是圆括号的问题,所以对于每一个下标都乘2,假设中间有一个.5即可,都变成了方括号,输出在处理一下。
- U [l,r]赋值为1
- I [0,l-1],[r+1,n]赋值为0
- D [l,r]区间涂0
- C [0,l-1],[r+1,n]赋值为0,[l,r]区间异或
- S [l,r]区间异或
bug列表:乘2后从0开始,因为0*2=0,0.5*2=1,zz的居然是从2开始的。。
读入的区间并不都是一位数。。。
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<iostream> using namespace std; const int N = 1000100; int tag ,xr ,ans ; char opt[10],s[10]; bool fir = true; #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 void pushdown(int rt) { if (tag[rt]!=-1) { tag[rt<<1] = tag[rt<<1|1] = tag[rt]; xr[rt<<1] = xr[rt<<1|1] = 0; tag[rt] = -1; } if (xr[rt]) { xr[rt<<1] ^= 1;xr[rt<<1|1] ^= 1; xr[rt] = 0; } } void update(int l,int r,int rt,int L,int R,int x) { if (L <= l && r <= R) { if (x != -1) tag[rt] = x,xr[rt] = 0; else xr[rt] ^= 1; return ; } pushdown(rt); int mid = (l + r) / 2; if (L <= mid) update(lson,L,R,x); if (R > mid) update(rson,L,R,x); } void query(int l,int r,int rt) { if (l == r) { if (tag[rt]!=-1) ans[l] = tag[rt]; ans[l] ^= xr[rt]; return ; } pushdown(rt); int mid = (l + r) / 2; query(lson);query(rson); } void get(int &L,int &R) { char c=getchar();int flag; while (c!='('&&c!='[') c=getchar(); scanf("%d",&L); flag = (c=='('); L = (L*2)+flag; c = getchar();scanf("%d",&R);c = getchar(); flag = -(c!=']');R = (R*2)+flag; } int main () { int n = 140000,L,R,lt; memset(tag,-1,sizeof(tag)); while (scanf("%s",opt)!=EOF) { get(L,R); //- if (opt[0]=='U') { update(0,n,1,L,R,1); } else if (opt[0]=='I') { if (L-1 >= 0) update(0,n,1,0,L-1,0); if (R+1 <= n) update(0,n,1,R+1,n,0); } else if (opt[0]=='D') { update(0,n,1,L,R,0); } else if (opt[0]=='C') { if (L-1 >= 0) update(0,n,1,0,L-1,0); if (R+1 <= n) update(0,n,1,R+1,n,0); update(0,n,1,L,R,-1); } else { update(0,n,1,L,R,-1); } } query(0,n,1); int pos=0,flag=0; for (int i=0; i<=n; i=pos+1) { pos=i; if (!ans[i]) continue; if (flag) printf(" "); flag=1; while (ans[pos+1]) pos++; if (i&1) printf("(%d,",i/2); else printf("[%d,",i/2); if (pos&1) printf("%d)",(pos+1)/2); else printf("%d]",pos/2); } if (!flag) puts("empty set");//- return 0; }
相关文章推荐
- [线段树 标记] BZOJ 3226 [Sdoi2008]校门外的区间
- [BZOJ3226][SDOI2008]校门外的区间(线段树)
- [BZOJ]3226: [Sdoi2008]校门外的区间 线段树
- BZOJ-3226 [SDOI2008]校门外的区间
- bzoj 3226: [Sdoi2008]校门外的区间
- 3226: [Sdoi2008]校门外的区间 线段树
- 【SDOI2008】【BZOJ3226】校门外的区间
- 【bzoj3226】[Sdoi2008]校门外的区间
- bzoj 3226: [Sdoi2008]校门外的区间(线段树)
- 【分块】bzoj3226 [Sdoi2008]校门外的区间
- BZOJ 3226 [SDOI2008]校门外的区间
- bzoj 3226 [Sdoi2008]校门外的区间(线段树)
- bzoj3226: [Sdoi2008]校门外的区间 线段树
- 3226: [Sdoi2008]校门外的区间
- 3226: [Sdoi2008]校门外的区间
- BZOJ 题目 3226: [Sdoi2008]校门外的区间(线段树区间交并差异或)
- [bzoj3226][Sdoi2008]校门外的区间——线段树
- BZOJ 3226: [Sdoi2008]校门外的区间
- BZOJ3226[Sdoi2008]校门外的区间 题解
- BZOJ3226 [Sdoi2008]校门外的区间