您的位置:首页 > 其它

【POJ】3225 Help with Intervals

2012-05-22 11:43 399 查看
#include<cstdio>
#include<cstring>
#define MAXN 131080
#define INF 987654321
int lazy[MAXN<<2],cover[MAXN<<2];
bool vis[MAXN<<1];
inline void FXOR(int rt)
{
if(cover[rt]!=-1)
{
cover[rt]^=1;
lazy[rt]=0;
}
else
lazy[rt]^=1;
}
inline void PushDown(int rt)
{
if(cover[rt]!=-1)
{
cover[rt<<1]=cover[rt<<1|1]=cover[rt];
lazy[rt<<1]=lazy[rt<<1|1]=0;
cover[rt]=-1;
}
else if(lazy[rt])
{
FXOR(rt<<1);
FXOR(rt<<1|1);
lazy[rt]=0;
}
}
void Change(int x,int y,int L,int R,int rt)
{
if(x<=L&&R<=y)
FXOR(rt);
else
{
int mid=(L+R)>>1;
PushDown(rt);
if(mid>=x)
Change(x,y,L,mid,rt<<1);
if(y>mid)
Change(x,y,mid+1,R,rt<<1|1);
}
}
void Update(int x,int y,int val,int L,int R,int rt)
{
if(x<=L&&R<=y)
{
lazy[rt]=0;
cover[rt]=val;
}
else
{
int mid=(L+R)>>1;
PushDown(rt);
if(mid>=x)
Update(x,y,val,L,mid,rt<<1);
if(y>mid)
Update(x,y,val,mid+1,R,rt<<1|1);
}
}
void Query(int L,int R,int rt)
{
if(cover[rt]==1)
{
for(int i=L;i<=R;i++)
vis[i]=true;
}
else if(cover[rt]==-1&&L!=R)
{
int mid=(L+R)>>1;
PushDown(rt);
Query(L,mid,rt<<1);
Query(mid+1,R,rt<<1|1);
}
}
int main()
{
char ch,left,right;
int x,y,i,j;
bool flag;
memset(cover,0,sizeof(cover));
memset(lazy,0,sizeof(lazy));
while(~scanf(" %c %c%d,%d %c",&ch,&left,&x,&y,&right))
{
x<<=1;
y<<=1;
if(left=='(')
x++;
if(right==')')
y--;
if(x>y)
continue;
if(ch=='U')
Update(x,y,1,0,MAXN,1);
else if(ch=='I')
{
if(x>0)
Update(0,x-1,0,0,MAXN,1);
if(y<MAXN)
Update(y+1,MAXN,0,0,MAXN,1);
}
else if(ch=='D')
Update(x,y,0,0,MAXN,1);
else if(ch=='C')
{
if(x>0)
Update(0,x-1,0,0,MAXN,1);
if(y<MAXN)
Update(y+1,MAXN,0,0,MAXN,1);
Change(x,y,0,MAXN,1);
}
else
Change(x,y,0,MAXN,1);
}
memset(vis,false,sizeof(vis));
Query(0,MAXN,1);
flag=false;
for(i=0;i<=MAXN;i++)
{
if(vis[i])
{
for(j=i;j<=MAXN&&vis[j];j++);
x=i;
y=j-1;
if(flag)
putchar(' ');
printf("%c%d,%d%c",x&1?'(':'[',x>>1,(y+1)>>1,y&1?')':']');
flag=true;
i=j;
}
}
if(flag)
putchar('\n');
else
puts("empty set");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: