略复杂的一道题,首先要处理开闭区间问题,扩大两倍即可,注意输入最后要\n,初始化不能随便memset

采用线段树,对线段区间进行0,1标记表示该区间是否包含在s内
U T S ← S ∪ T 即将[l,r]标记为1
I T S ← S ∩ T 即将-oo~l和r~+oo标记为0,因为是并集,所以并集后的集合s一定在[l,r]内,则在l,r内的集合被标记是什么状态就是什么状态(表示是否属于s),[l,r]外的集合不属于s所以标记为0
D T S ← S - T  即将[l,r]标记为0,则在[l,r]内被s包含的集合也会标记为0表示不再属于s
C T S ← T - S  即先将-oo~l,r~+oo标记为0,这部分不属于[l,r]则一定不属于s,然后将[l,r]的标记0/1互换,因为属于s的不再属于s,不属于s的将属于s
S T S ← S ⊕ T  即属于s的不变,[l,r]中不属于s的(区间)0标记为1,属于s的(区间)1标记为0,所以[l,r]的标记0/1互换

最后对区间l,r标记时标记将l*2,r*2标记,如果是闭区间则对l*2+1,或r*2-1进行标记,则输出的时候只需判断奇偶就能判断开闭区间
是否覆盖0,1是否转换0,1的0,1转换都可以用异或去转换
Sample Input
U [1,5]
D [3,3]
S [2,4]
C (1,5)
I (2,3]
Sample Output
(2,3)

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn=;
int tot=;
int n,m,t;
int Xor[maxn<<],cov[maxn<<]; //异或标记,覆盖标记
int hash[maxn<<];
void XXor(int rt)
{
if(cov[rt]!=-) cov[rt]^=; //说明该区域有值存在
else Xor[rt]^=;
}
void pushdown(int rt)
{
if(cov[rt]!=-)
{
cov[rt<<]=cov[rt<<|]=cov[rt];
Xor[rt<<]=Xor[rt<<|]=;
cov[rt]=-;
}
if(Xor[rt])
{
XXor(rt<<);
XXor(rt<<|);
Xor[rt]=;
}
}
void update(char op,int L,int R,int l,int r,int rt)
{
if(l>=L&&r<=R)
{ if(op=='U') cov[rt]=,Xor[rt]=;
else if(op=='D') cov[rt]=Xor[rt]=;
else if(op=='C'||op=='S') XXor(rt);
return;
}
pushdown(rt);
int m=(l+r)>>;
if(L<=m) update(op,L,R,lson);
else if(op=='I'||op=='C') cov[rt<<]=Xor[rt<<]=;
if(m<R) update(op,L,R,rson);
else if(op=='I'||op=='C') cov[rt<<|]=Xor[rt<<|]=;
}
void query(int l,int r,int rt)
{
if(cov[rt]==)
{
for(int i=l;i<=r;i++) hash[i]=;
return;
}
else if(cov[rt]==) return;
if(l==r) return;
pushdown(rt);
int m=(r+l)>>;
query(lson);
query(rson);
}
int main()
{
int i,j,k;
//freopen("1.in","r",stdin);
char l,r,op;
int a,b;
while(scanf("%c %c%d,%d%c\n",&op,&l,&a,&b,&r)!=EOF)
{
a<<=,b<<=; //区间扩大一倍,解决开闭区间问题
//printf("%d %d\n",a,b);
if(l=='(') a++;
if(r==')') b--;
if(a>b) //说明a和b的值相等
{
if(op=='C'||op=='I') cov[]=Xor[]=,printf(""); //整个区间为0
}
else update(op,a,b,,maxn,);
}
k=;
query(,maxn,); //此时区间内的有效区域值为1
int s=-,e; //判断左右区间位置 for(i=;i<=maxn;i++)
{
if(hash[i]) //该区域被覆盖
{
if(s==-) s=i;
e=i;
}
else
{
if(s!=-) //说明存在一个完整区间
{
if(k++) printf(" ");
printf("%c%d,%d%c",s&?'(':'[',s>>,(e+)>>,e&?')':']'); //&运算用来判断奇偶,偶数的话二进制末位为0,and1得0,说明为闭区间
s=-;
}
}
}
if(k==) printf("empty set");
puts("");
return ;
}

poj 3225 线段树+位运算的更多相关文章

  1. poj 2777 Count Color - 线段树 - 位运算优化

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42472   Accepted: 12850 Description Cho ...

  2. POJ 2777 Count Color(线段树+位运算)

    题目链接:http://poj.org/problem?id=2777 Description Chosen Problem Solving and Program design as an opti ...

  3. hdu 5023 线段树+位运算

    主要考线段树的区间修改和区间查询,这里有一个问题就是这么把一个区间的多种颜色上传给父亲甚至祖先节点,在这里题目告诉我们最多30颜色,那么我们可以把这30中颜色用二进制储存和传给祖先节点,二进制的每一位 ...

  4. Codeforces 620E New Year Tree(线段树+位运算)

    题目链接 New Year Tree 考虑到$ck <= 60$,那么用位运算统计颜色种数 对于每个点,重新标号并算出他对应的进和出的时间,然后区间更新+查询. 用线段树来维护. #includ ...

  5. Count Color(线段树+位运算 POJ2777)

    Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39917 Accepted: 12037 Descrip ...

  6. Codeforces Round #590 (Div. 3) D. Distinct Characters Queries(线段树, 位运算)

    链接: https://codeforces.com/contest/1234/problem/D 题意: You are given a string s consisting of lowerca ...

  7. POJ 3225 线段树区间更新(两种更新方式)

    http://blog.csdn.net/niuox/article/details/9664487 这道题明显是线段树,根据题意可以知道: (用0和1表示是否包含区间,-1表示该区间内既有包含又有不 ...

  8. poj_2777线段树+位运算

    第一次没想到用位运算,不出意料的T了,,, PS:在床上呆了接近两个月后,我胡汉三又杀回来刷题啦-- #include<iostream> #include<cstdio> # ...

  9. 【洛谷】【线段树+位运算】P2574 XOR的艺术

    [题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...

随机推荐

  1. (翻译)初学者的object-C指南

    初学者的object-C指南 英文原文:http://blog.teamtreehouse.com/the-beginners-guide-to-objective-c-language-and-va ...

  2. WPF 窗口在右下角出现,识别分辨率

    直接上代码. Point brp = SystemParameters.WorkArea.BottomRight;//当前桌面右下角的位置

  3. [转]优化wp_head()

    经过对head的优化,我的博客访问速度也快了好多,在此过程中也了解到wp_head()模板函数的作用,可以再次优化,特此记录. 步骤:加入到function.phpremove_action(‘wp_ ...

  4. POJ 1054 The Troublesome Frog

    The Troublesome Frog Time Limit: 5000MS Memory Limit: 100000K Total Submissions: 9581 Accepted: 2883 ...

  5. Milking Cows

    Milking Cows Three farmers rise at 5 am each morning and head for the barn to milk three cows. The f ...

  6. mySQL笔记2

    php主要实现B/S .net IIS java TomCat LAMP: Linux 系统 A阿帕奇服务器 Mysql数据库 Php语言(KE) mysql:c常用代码 create table c ...

  7. zstu.4194: 字符串匹配(kmp入门题&& 心得)

    4194: 字符串匹配 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 206  Solved: 78 Description 给你两个字符串A,B,请 ...

  8. Arbitrage(bellman_ford)

    Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16652   Accepted: 7004 Descri ...

  9. Unity3d iOS基本优化和高级优化

    原地址:http://www.cocoachina.com/bbs/read.php?tid=70395&page=1 分享看见的2篇好文.简单翻译了一下并且放出原文 http://www.c ...

  10. [BZOJ3672][UOJ#7][NOI2014]购票

    [BZOJ3672][UOJ#7][NOI2014]购票 试题描述  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.       ...