mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
Create 3225_niuox.cpp
From http://blog.csdn.net/niuox/article/details/9664487
This commit is contained in:
parent
3f81dbcef7
commit
e5a25ecaeb
121
POJ/3225_niuox.cpp
Normal file
121
POJ/3225_niuox.cpp
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#define Maxn 132000
|
||||||
|
|
||||||
|
//宏定义最好全加上括号
|
||||||
|
#define lx (x<<1)
|
||||||
|
#define rx ((x<<1) | 1)
|
||||||
|
#define MID ((l + r)>>1)
|
||||||
|
|
||||||
|
int cover[Maxn<<2];
|
||||||
|
int XOR[Maxn<<2];
|
||||||
|
bool vis[Maxn+5];
|
||||||
|
|
||||||
|
void FXOR(int x)
|
||||||
|
{
|
||||||
|
if(cover[x]!=-1) cover[x] ^= 1;
|
||||||
|
//注意是else
|
||||||
|
else XOR[x] ^= 1;
|
||||||
|
}
|
||||||
|
void pushDown(int x)
|
||||||
|
{
|
||||||
|
//cover[x] == -1代表x节点的覆盖工作已经结束
|
||||||
|
if(cover[x]!=-1)
|
||||||
|
{
|
||||||
|
cover[lx] = cover[rx] = cover[x];
|
||||||
|
XOR[lx] = XOR[rx] = 0;//既然已经覆盖异或标记就清零
|
||||||
|
cover[x] = -1;
|
||||||
|
}
|
||||||
|
if(XOR[x])
|
||||||
|
{
|
||||||
|
FXOR(lx);
|
||||||
|
FXOR(rx);
|
||||||
|
XOR[x] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void update(int L,int R,char op,int l,int r,int x)
|
||||||
|
{
|
||||||
|
if(L<=l && r<=R)
|
||||||
|
{
|
||||||
|
if(op == 'U')
|
||||||
|
{
|
||||||
|
cover[x] = 1;
|
||||||
|
XOR[x] = 0;
|
||||||
|
}
|
||||||
|
//op == 'I'的情况,由于L<=l && r<=R,所以不需要讨论
|
||||||
|
else if(op == 'D')
|
||||||
|
{
|
||||||
|
cover[x] = 0;
|
||||||
|
XOR[x] = 0;
|
||||||
|
}
|
||||||
|
else if(op == 'C') FXOR(x);
|
||||||
|
else if(op == 'S') FXOR(x);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pushDown(x);
|
||||||
|
if(L<=MID) update(L,R,op,l,MID,lx);
|
||||||
|
else if(op == 'I' || op == 'C') cover[lx] = XOR[lx] = 0;
|
||||||
|
if(MID<R) update(L,R,op,MID+1,r,rx);
|
||||||
|
else if(op == 'I' || op == 'C') cover[rx] = XOR[rx] = 0;
|
||||||
|
}
|
||||||
|
//只适合于一次查询
|
||||||
|
void query(int l,int r,int x)
|
||||||
|
{
|
||||||
|
if(cover[x] == 1)
|
||||||
|
{
|
||||||
|
for(int i=l; i<=r; i++) vis[i] = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if(cover[x] == 0) return;
|
||||||
|
if(l == r) return;
|
||||||
|
pushDown(x);
|
||||||
|
query(l,MID,lx);
|
||||||
|
query(MID+1,r,rx);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
#ifndef ONLINE_JUDGE
|
||||||
|
freopen("in.txt","r",stdin);
|
||||||
|
#endif
|
||||||
|
int a,b;
|
||||||
|
char op,lchar,rchar;
|
||||||
|
XOR[1] = cover[1] = 0;
|
||||||
|
while(scanf("%c %c%d,%d%c\n",&op,&lchar,&a,&b,&rchar)!=EOF)
|
||||||
|
{
|
||||||
|
a<<=1;
|
||||||
|
b<<=1;
|
||||||
|
if(lchar == '(') a++;
|
||||||
|
if(rchar == ')') b--;
|
||||||
|
update(a,b,op,0,Maxn,1);
|
||||||
|
}
|
||||||
|
query(0,Maxn,1);
|
||||||
|
int s = -1,e;
|
||||||
|
bool flag = false;
|
||||||
|
for(int i=0;i<=Maxn;i++)
|
||||||
|
{
|
||||||
|
if(vis[i] == 1)
|
||||||
|
{
|
||||||
|
if(s == -1) s = i;
|
||||||
|
e = i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(s!=-1)
|
||||||
|
{
|
||||||
|
if(flag) printf(" ");
|
||||||
|
printf("%c%d,%d%c",s&1?'(':'[',s>>1,(e+1)>>1,e&1?')':']');
|
||||||
|
s = -1;
|
||||||
|
flag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!flag) printf("empty set");
|
||||||
|
puts("");
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user