线段树成段更新 poj 3325
2012-10-13 17:39
357 查看
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<vector> #include<sstream> #include<string> #include<climits> #include<stack> #include<set> #include<bitset> #include<cmath> #include<deque> #include<map> #include<queue> #define iinf 2000000000 #define linf 1000000000000000000LL #define dinf 1e200 #define eps 1e-5 #define all(v) (v).begin(),(v).end() #define sz(x) x.size() #define pb push_back #define mp make_pair #define lng long long #define sqr(a) ((a)*(a)) #define pii pair<int,int> #define pll pair<lng,lng> #define pss pair<string,string> #define pdd pair<double,double> #define X first #define Y second #define pi 3.14159265359 #define ff(i,xi,n) for(int i=xi;i<=(int)(n);++i) #define ffd(i,xi,n) for(int i=xi;i>=(int)(n);--i) #define ffl(i,r) for(int i=head[r];i!=-1;i=edge[i].next) #define cc(i,j) memset(i,j,sizeof(i)) #define two(x) ((lng)1<<(x)) #define N 131072 #define M 1000000 #define lson l , mid , rt << 1 #define rson mid + 1 , r , rt << 1 | 1 #define Mod n #define Pmod(x) (x%Mod+Mod)%Mod using namespace std; typedef vector<int> vi; typedef vector<string> vs; typedef unsigned int uint; typedef unsigned lng ulng; template<class T> inline void checkmax(T &x,T y){if(x<y) x=y;} template<class T> inline void checkmin(T &x,T y){if(x>y) x=y;} template<class T> inline T Min(T x,T y){return (x>y?y:x);} template<class T> inline T Max(T x,T y){return (x<y?y:x);} template<class T> T gcd(T a,T b){return (a%b)==0?b:gcd(b,a%b);} template<class T> T lcm(T a,T b){return a*b/gcd(a,b);} template<class T> T Abs(T a){return a>0?a:(-a);} template<class T> inline T lowbit(T n){return (n^(n-1))&n;} template<class T> inline int countbit(T n){return (n==0)?0:(1+countbit(n&(n-1)));} template<class T> inline bool isPrimeNumber(T n) {if(n<=1)return false;for (T i=2;i*i<=n;i++) if (n%i==0) return false;return true;} int clo[N<<2],XOR[N<<2],le,ri; bool in ; inline void FXOR(int rt) { if(clo[rt]!=-1) clo[rt]^=1; else XOR[rt]^=1; } inline void pushdown(int rt) { if(clo[rt]!=-1) { clo[rt<<1]=clo[rt<<1|1]=clo[rt]; XOR[rt<<1]=XOR[rt<<1|1]=0; clo[rt]=-1; } if(XOR[rt]) { FXOR(rt<<1); FXOR(rt<<1|1); XOR[rt]=0; } } void update(int L,int R,char opt,int l,int r,int rt) { if(L<=l&&r<=R) { if(opt=='U') { clo[rt]=1; XOR[rt]=0; } else if(opt=='D') { clo[rt]=0; XOR[rt]=0; } else if(opt=='C'||opt=='S') { FXOR(rt); } return ; } pushdown(rt); int mid=(l+r)>>1; if(L<=mid) update(L,R,opt,lson); else if(opt=='I'||opt=='C') { clo[rt<<1]=0; XOR[rt<<1]=0; } if(R>mid) update(L,R,opt,rson); else if(opt=='I'||opt=='C') { clo[rt<<1|1]=0; XOR[rt<<1|1]=0; } } void query(int l,int r,int rt) { if(clo[rt]==1) { ff(i,l,r) in[i]=1; return ; } else if(clo[rt]==0) return ; pushdown(rt); int mid=(l+r)>>1; query(lson); query(rson); } int main() { // freopen("data.in","r",stdin); char opt,a,b; clo[1]=0; XOR[1]=0; while(~scanf("%c %c%d,%d%c",&opt,&a,&le,&ri,&b)) { le<<=1,ri<<=1; if(a=='(') ++le; if(b==')') --ri; if(le>ri) { if(opt=='C'||opt=='I') clo[1]=0,XOR[1]=0; } else update(le,ri,opt,0,N,1); getchar(); } query(0,N,1); bool f=false; int fr=-1,re; ff(i,0,N) { if(in[i]) { if(fr==-1) { fr=i; } re=i; } else { if(fr!=-1) { if(f) putchar(' '); f=true; printf("%c%d,%d%c",fr&1?'(':'[',fr>>1,(re+1)/2,re&1?')':']'); fr=-1; } } } if(!f) printf("empty set"); puts(""); return 0; }
相关文章推荐
- poj 2155 (二维线段树的成段更新)
- POJ - 3468 线段树成段更新
- poj 3468 A Simple Problem with Integers(线段树)(第二部分 成段更新,区间求和)
- poj 3468 A Simple Problem with Integers 线段树成段更新模板
- POJ -- 3468 --线段树成段更新
- poj 3468 A Simple Problem with Integers 【线段树-成段更新】
- poj_3468,线段树成段更新
- [ACM] poj 3468 A Simple Problem with Integers(线段树,成段更新,懒惰标记)
- POJ训练计划2777_Count Color(线段树/成段更新/区间染色)
- poj3468~线段树成段更新求和
- 线段树(区间操作) POJ 3325 Help with Intervals
- poj 3669 线段树成段更新+区间合并
- POJ 2155 Matrix(快)(二维线段树段更新求点和)(不保存left,right域)
- poj 3468 A Simple Problem with Integers(线段树——成段更新问题)
- POJ - 2777 Count Color(线段树 成段更新 区间查询)
- Poj 2528 Mayor's posters 线段树 离散化 成段更新
- POJ 3468 A Simple Problem with Integers?(线段树成段更新求和)
- POJ训练计划2777_Count Color(线段树/成段更新/区间染色)
- POJ 3225 Help with Intervals (线段树 成段更新, 懒惰标记*2)
- poj 3468 -- A Simple Problem with Integers ( 线段树 , 段更新 , 段求和 )