POJ 3225 Help with Intervals
线段树 区间更新 延迟标记
/* *********************************************** Author :Zhou Zhentao Email :774388357@qq.com Created Time :2015/12/2 21:13:05 File Name :main.cpp ************************************************ */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; const int maxn=66000*2; int a,b; char op,lchar,rchar; struct SegTree { int Cover,Xor; }segTree[maxn*4]; bool vis[maxn+10]; void build(int l,int r,int rt) { segTree[rt].Cover=segTree[rt].Xor=0; if(l==r) return; int m=(l+r)/2; build(l,m,2*rt); build(m+1,r,2*rt+1); } void pushDown(int rt) { if(segTree[rt].Cover==1) { segTree[2*rt].Cover=segTree[2*rt+1].Cover=1; segTree[2*rt].Xor=segTree[2*rt+1].Xor=0; } else if(segTree[rt].Cover==0) { segTree[2*rt].Cover=segTree[2*rt+1].Cover=0; segTree[2*rt].Xor=segTree[2*rt+1].Xor=0; } else { if(segTree[2*rt].Cover==1) { segTree[2*rt].Cover=0; segTree[2*rt].Xor=0; } else if(segTree[2*rt].Cover==0) { segTree[2*rt].Cover=1; segTree[2*rt].Xor=0; } else if(segTree[2*rt].Xor==0) { segTree[2*rt].Cover=-1; segTree[2*rt].Xor=1; } else if(segTree[2*rt].Xor==1) { segTree[2*rt].Cover=-1; segTree[2*rt].Xor=0; } if(segTree[2*rt+1].Cover==1) { segTree[2*rt+1].Cover=0; segTree[2*rt+1].Xor=0; } else if(segTree[2*rt+1].Cover==0) { segTree[2*rt+1].Cover=1; segTree[2*rt+1].Xor=0; } else if(segTree[2*rt+1].Xor==0) { segTree[2*rt+1].Cover=-1; segTree[2*rt+1].Xor=1; } else if(segTree[2*rt+1].Xor==1) { segTree[2*rt+1].Cover=-1; segTree[2*rt+1].Xor=0; } } segTree[rt].Cover=-1; segTree[rt].Xor=0; } void update(int L,int R,int info,int l,int r,int rt) { if(L<=l&&r<=R) { if(info!=2) { segTree[rt].Xor=0; segTree[rt].Cover=info; } else if(info==2) { if(segTree[rt].Cover==0) { segTree[rt].Cover=1; segTree[rt].Xor=0; } else if(segTree[rt].Cover==1) { segTree[rt].Cover=0; segTree[rt].Xor=0; } else if(segTree[rt].Xor==0) { segTree[rt].Xor=1; segTree[rt].Cover=-1; } else if(segTree[rt].Xor==1) { segTree[rt].Xor=0; segTree[rt].Cover=-1; } } return; } if(segTree[rt].Cover!=-1||segTree[rt].Xor!=0) pushDown(rt); int m=(l+r)/2; if(L<=m) update(L,R,info,l,m,2*rt); if(R>m) update(L,R,info,m+1,r,2*rt+1); } void quary(int l,int r,int rt) { if(segTree[rt].Cover==1||segTree[rt].Cover==0) { if(segTree[rt].Cover==1) for(int i=l;i<=r;i++) vis[i]=1; return; } if(l==r) return; if(segTree[rt].Cover!=-1||segTree[rt].Xor!=0) pushDown(rt); int m=(l+r)/2; quary(l,m,2*rt); quary(m+1,r,2*rt+1); } int main() { build(0,maxn,1); char s[100]; while(gets(s)) { int len=strlen(s),op,a=0,b=0; int i; for(i=3;i<len;i++) { if(!isdigit(s[i])) break; a=a*10+s[i]-'0'; } for(i++;i<len;i++) { if(!isdigit(s[i])) break; b=b*10+s[i]-'0'; } if(s[i]==']') b=b*2; else b=b*2-1; if(s[2]=='[') a=a*2; else a=a*2+1; if(b<a) { if(op=='I' || op=='C') update(0,maxn,0,0,maxn,1); continue; } op=s[0]; if(op=='U') update(a,b,1,0,maxn,1); if(op=='I') { if(a>0) update(0,a-1,0,0,maxn,1); if(b<maxn)update(b+1,maxn,0,0,maxn,1); } if(op=='D') update(a,b,0,0,maxn,1); if(op=='C') { if(a>0) update(0,a-1,0,0,maxn,1); if(b<maxn) update(b+1,maxn,0,0,maxn,1); update(a,b,2,0,maxn,1); } if(op=='S') update(a,b,2,0,maxn,1); } memset(vis,0,sizeof vis); quary(0,maxn,1); bool first=true; for(int i=0;i<maxn;i++) { if(vis[i]==1 && (i==0 || (i>0&&vis[i-1]==0) ))a=i; if(vis[i]==1 && (i==maxn-1 || vis[i+1]==0)) { if(first)first=false; else printf(" "); if(a%2)printf("("); else printf("["); printf("%d,",a/2); printf("%d",(i+1)/2); if(i%2)printf(")"); else printf("]"); } } if(first)printf("empty set"); printf("\n"); return 0; }