您的位置:首页 > 其它

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]取反。

然后用线段树维护区间。

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: