---恢复内容开始---

【题目大意】

(直接引用ACM神犇概括,貌似是notonlysucess?)

U:把区间[l,r]覆盖成1
I:把[-∞,l)(r,∞]覆盖成0
D:把区间[l,r]覆盖成0
C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换
S:[l,r]区间0/1互换

【思路】

由于涉及到开区间和闭区间,我们如此规定数组下表:

下标      0      1      2      3      4      5……

含义1   (1    1    (2      2    (3    3……

含义2    /      /     1)     /      2)     /……


cover表示区间覆盖,Xor表示区间取反。

如果cover要直接覆盖的话,Xor的值就没有意义了,可以清为0;如果要区间取反的话,如果cover有值则将cover取反,否则就将Xor取反。注意一下边界……

QuQ死磕了一个上午才搞定,后来才发现原来我忘记把freopen的语句删掉了!痛彻心扉,从此铭记,不再犯!

 /*模板来自于notonlysuccess*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int MAXN=*;
int cover[MAXN<<];//-1里面不确定,0覆盖0,1覆盖1
int Xor[MAXN<<];//0表示区间取反过来,1表示区间不取反
int hash[MAXN+]; void Fxor(int rt)//对rt进行01对调
{
if (cover[rt]!=-)
{
cover[rt]^=;
}
else Xor[rt]^=;
} void pushdown(int rt)
{
if (cover[rt]!=-)
{
cover[rt<<]=cover[rt<<|]=cover[rt];
Xor[rt<<]=Xor[rt<<|]=;
cover[rt]=-;//由于cover的值已经给两个孩子,此时将cover设为-1
}
if (Xor[rt])
{
Fxor(rt<<);
Fxor(rt<<|);
Xor[rt]=;//由于已经将Xor的值给两个孩子,此时Xor清为0
}
} void update(char op,int L,int R,int l,int r,int rt)
{
if (L<=l && r<=R)
{
if (op=='U')
{
cover[rt]=;
Xor[rt]=;
}
else if (op=='D')
{
cover[rt]=;
Xor[rt]=;
}
else if (op=='S'||op=='C')
Fxor(rt);
return;
}
pushdown(rt);
int m=(l+r)>>;
if (m>=L) update(op,L,R,lson);
else if (op=='C'||op=='I') cover[rt<<]=Xor[rt<<]=;
if (m+<=R) update(op,L,R,rson);
else if (op=='C'||op=='I') cover[rt<<|]=Xor[rt<<|]=;
} void query(int l,int r,int rt)
{
if (cover[rt]==)
{
for (int i=l;i<=r;i++) hash[i]=;
return;
}else if (cover[rt]==) return;//全部覆盖为0的时候直接退出
if (l==r) return;//说明已经走到了叶子节点
pushdown(rt);//凡是接下来要对孩子进行操作的,均要延迟更新
int m=(l+r)>>;
query(lson);
query(rson);
} void init()
{
char op,lo,ro;
int l,r;
Xor[]=cover[]=;
while (scanf("%c %c%d,%d%c",&op,&lo,&l,&r,&ro)!=EOF)
{
l<<=;
r<<=;
if (lo=='(') l++;
if (ro==')') r--;
if (l>r)
{
if (op=='C' || op=='I') cover[]=Xor[]=;
}
else update(op,l,r,,MAXN,);
getchar();
}
} void getans()
{
memset(hash,,sizeof(hash));
query(,MAXN,);
int flag=,s=-,e=-;
for (int i=;i<=MAXN;i++)
{
if (hash[i]== && s!=-)
{
e=i-;
if (flag) cout<<' ';
flag=;
printf("%c%d,%d%c", s&?'(':'[', s>> , (e+)>> , e&?')':']');
s=e=-;
}
else
if (hash[i]== && s==-)
s=i;
}
if (!flag) cout<<"empty set"<<endl;
} int main()
{
//freopen("POJ3225.in","r",stdin);
init();
getans();
return ;
}

【线段树】POJ3225-Help with Intervals的更多相关文章

  1. 线段树 poj3225

    U:把区间[l,r]覆盖成1I:把[-∞,l)(r,∞]覆盖成0    D:把区间[l,r]覆盖成0C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换S:[l,r]区间0/1互换 因 ...

  2. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  3. poj 3225 Help with Intervals(线段树,区间更新)

    Help with Intervals Time Limit: 6000MS   Memory Limit: 131072K Total Submissions: 12474   Accepted:  ...

  4. 2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树)

    2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树) 传送门:https://nanti.jisuanke.com/t/41296 题意: 给一个数列A 问在数列A中有多 ...

  5. 线段树(区间操作) POJ 3325 Help with Intervals

    题目传送门 题意:四种集合的操作,对应区间的01,问最后存在集合存在的区间. 分析:U T [l, r]填充1; I T [0, l), (r, N]填充0; D T [l, r]填充0; C T[0 ...

  6. POJ 3225 Help with Intervals --线段树区间操作

    题意:给你一些区间操作,让你输出最后得出的区间. 解法:区间操作的经典题,借鉴了网上的倍增算法,每次将区间乘以2,然后根据区间开闭情况做微调,这样可以有效处理开闭区间问题. 线段树维护两个值: cov ...

  7. poj3225(线段树区间更新&hash)

    题目链接: http://poj.org/problem?id=3225 题意: 初始给一个全局为 0~65536 的区间  s, 然后不断地对区间 s 进行 并, 交, 差, 相对差等运算, 输出最 ...

  8. 2018宁夏邀请赛 Continuous Intervals(单调栈 线段树

    https://vjudge.net/problem/Gym-102222L 题意:给你n个数的序列,让判断有几个区间满足排完序后相邻两数差都不大于1. 题解:对于一个区间 [L,R],记最大值为 m ...

  9. [转载]完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...

随机推荐

  1. Intel call指令

    转载:http://blog.ftofficer.com/2010/04/n-forms-of-call-instructions/ 最近有一个需求,给你个地址,看看这个地址前面是不是一个CALL指令 ...

  2. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 动态树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 题意:加边,删边,查询到根的距离. #include <bits/stdc++ ...

  3. .net设置浏览器的文本模式

    这段时间做个项目,做的时候因为之前习惯了Google的调试方式,所以就一直在google上面调试,今天项目成员大家的部分要整合,就放到ie8下面测试,但是遇到一个问题,就是用ie打开之后文本模式一直是 ...

  4. position:fixed部分版本的浏览器不支持

    ie6-ie8浏览器不支持这个属性 .fixed{         position:fixed; /*对于火狐等其他浏览器需要设置的*/         top:700px;  /*同上*/     ...

  5. 从一个R语言案例学线性回归

    线性回归简介 如下图所示,如果把自变量(也叫independent variable)和因变量(也叫dependent variable)画在二维坐标上,则每条记录对应一个点.线性回规最常见的应用场景 ...

  6. Leetcode 之Binary Tree Postorder Traversal(44)

    后序遍历,比先序和中序都要复杂.访问一个结点前,需要先判断其右孩子是否被访问过.如果是,则可以访问该结点:否则,需要先处理右子树. vector<int> postorderTravers ...

  7. go run/ go install/ go build / go get的区别

    go run 运行当个.go文件 go install 在编译源代码之后还安装到指定的目录 go build 加上可编译的go源文件可以得到一个可执行文件 go get = git clone + g ...

  8. Java Web学习脑图

    Java Web学习脑图,从知乎上摘录,感谢知乎网友的分享.

  9. python webpy 框架环境架设

    前几年使用过 webpy做个些小东西,今天有个东西从拾webpy.但是基本上都忘记了,还是那句古话“好记性不如烂笔头”.这里把相应的步骤梳理下. 前提: 操作系统 windows 一.webpy 方面 ...

  10. 前端的3D(css3版本)--淘宝造物节3D创景的制作

    其实是依托Css3的功劳,先上一个例子 链接: https://pan.baidu.com/s/1cZ-mMI01FHO3u793ZhvF2w 提取码: d3s7代码地址:链接: https://pa ...