poj 3225 Help with Intervals
2014-08-11 21:34
323 查看
http://poj.org/problem?id=3225
题意:对集合进行交、并、差、异或四种操作,输出几步操作的之后的集合。
U [a,b] :可以将[a,b]全部置为1; I [a,b] :可以将[a,b]之外的全部置为0; S-[a,b] :将[a,b]全部置为0; [a,b]-s :将[a,b]之外的全部置为0,[a,b]取反。 I [a,b] :将[a,b]取反。
然后用线段树维护区间。
View Code
题意:对集合进行交、并、差、异或四种操作,输出几步操作的之后的集合。
U [a,b] :可以将[a,b]全部置为1; I [a,b] :可以将[a,b]之外的全部置为0; S-[a,b] :将[a,b]全部置为0; [a,b]-s :将[a,b]之外的全部置为0,[a,b]取反。 I [a,b] :将[a,b]取反。
然后用线段树维护区间。
#include <cstdio> #include <cstring> #include<cctype> #include <algorithm> #define maxn 132000 using namespace std; const int N=6000000; char str[100]; bool visi ; struct node { int l,r; int x; bool flag; }tree ; void build(int i,int l,int r) { tree[i].l=l; tree[i].r=r; tree[i].x=0; tree[i].flag=false; if(l==r) return ; int mid=(l+r)>>1; build(i<<1,l,mid); build(i<<1|1,mid+1,r); } void down(int i) { if(tree[i].l==tree[i].r) { if(tree[i].flag) { tree[i].x^=1; tree[i].flag=false; } return ; } if(tree[i].x!=-1) { if(tree[i].flag) tree[i].x^=1; tree[i<<1].x=tree[i<<1|1].x=tree[i].x; tree[i].x=-1; tree[i<<1].flag=tree[i<<1|1].flag=false; tree[i].flag=false; } if(tree[i].flag) { tree[i].flag=false; if(tree[i<<1].x!=-1) tree[i<<1].x^=1; else tree[i<<1].flag^=true; if(tree[i<<1|1].x!=-1) tree[i<<1|1].x^=1; else tree[i<<1|1].flag^=true; } } void deal(int i,int l,int r,int c) { if(l>r) return; if(tree[i].l==l&&tree[i].r==r) { if(c==0||c==1) { tree[i].x=c; tree[i].flag=false; } else if(tree[i].x!=-1) { tree[i].x^=1; } else tree[i].flag^=1; return ; } down(i); int mid=(tree[i].l+tree[i].r)>>1; if(r<=mid) { deal(i<<1,l,r,c); } else if(l>mid) { deal(i<<1|1,l,r,c); } else { deal(i<<1,l,mid,c); deal(i<<1|1,mid+1,r,c); } } void search1(int i) { if(tree[i].x!=-1) { if(tree[i].x==1) { for(int j=tree[i].l; j<=tree[i].r; j++) visi[j]=true; } return ; } down(i); search1(i<<1); search1(i<<1|1); } int main() { build(1,0,maxn); while(gets(str)) { int k=strlen(str); int x=0,y=0; int i; for(i=3; i<k; i++) { if(!isdigit(str[i])) break; x=x*10+(str[i]-'0'); } int j; for(j=i+1; j<k; j++) { if(!isdigit(str[j])) break; y=y*10+(str[j]-'0'); } if(str[2]=='[') x=x*2; else x=x*2+1; if(str[j]==']') y=y*2; else y=y*2-1; if(str[0]=='U') { deal(1,x,y,1); } else if(str[0]=='I') { deal(1,0,x-1,0); deal(1,y+1,maxn,0); } else if(str[0]=='D') { deal(1,x,y,0); } else if(str[0]=='C') { deal(1,0,x-1,0); deal(1,y+1,maxn,0); deal(1,x,y,2); } else if(str[0]=='S') { deal(1,x,y,2); } } memset(visi,false,sizeof(visi)); search1(1); bool flag=false; for(int i=0; i<=maxn; i++) { if(!visi[i]) continue; int xx=i; while(visi[i]&&i<=maxn) i++; int yy=(--i); if(!flag) flag=true; else printf(" "); if(xx%2==0) printf("[%d,",xx/2); else printf("(%d,",xx/2); if(yy%2==0) printf("%d]",yy/2); else printf("%d)",(yy+1)/2); } if(!flag) printf("empty set"); printf("\n"); return 0; }
View Code
相关文章推荐
- POJ 3225 Help with Intervals(开区间和闭区间)
- poj 3225 Help with Intervals
- poj 3225 Help with Intervals(过题啦啦~)
- poj 3225 Help with Intervals -线段树-延迟标记-区间交并补
- POJ 3225 Help with Intervals
- POJ 3225 Help with Intervals(线段树)
- poj 3225 Help with Intervals(线段树+区间更新)
- POJ 3225 Help with Intervals(线段树成段更新)
- POJ 3225 Help with Intervals(线段树:区间置0/1,区间异或)
- POJ 3225——Help with Intervals(线段树,成段替换+区间异或+hash)
- POJ 3225 Help with Intervals
- POJ 3225 Help with Intervals
- POJ-3225 Help with Intervals-线段树/成段更新+倍增区间法
- poj 3225 Help with Intervals 线段树 集合的交并差补运算
- poj 3225 Help with Intervals
- (Relax 线段树1.4)POJ 3225 Help with Intervals
- POJ 3225 Help with Intervals
- POJ 3225 Help with Intervals --线段树区间操作
- POJ 3225 Help with Intervals (线段树 成段更新, 懒惰标记*2)
- poj 3225 Help with Intervals