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

【题目大意】

(直接引用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. 编写jquery Plugin

    编写jquery插件的原则 1.给$.fn绑定函数,实现插件的代码逻辑 2.插件函数最后要return this,以支持链式调用 3.插件函数要有默认值,绑定在$.fn.<pluginName& ...

  2. python之计算器

    开发一个简单的python计算器 1.实现加减乘除及拓号优先级解析 2.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * ...

  3. 【Python学习笔记】使用Python进行主成分分析

    使用sklearn库中的PCA类进行主成分分析. 导入要用到的库,还没有的直接pip安装就好了. from sklearn.decomposition import PCA import numpy ...

  4. 【Matlab】让Matlab程序发出声音

    我有时候运行一段很长的代码,在等待的时候去做别的事,希望程序运行完可以有一个提示音. 这可以用matlab的一个函数sound实现,该函数的输入参量是音频数据向量.采样频率和转换位数. % 响一声 s ...

  5. exit()与_exit()区别

    exit()与_exit()都是用来终止进程的函数,当程序执行到两者函数时,系统将会无条件停止剩下操作,清除进程结构体相应信息,并终止进程运行. 二者的主要区别在于:exit()函数在执行时,系统会检 ...

  6. python基础===解决python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX(转载)

    本文转自:解决python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX 从网上抓了一些字 ...

  7. Linux时间子系统之八:动态时钟框架(CONFIG_NO_HZ、tickless)【转】

    转自:http://blog.csdn.net/droidphone/article/details/8112948 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 数据结 ...

  8. win7旗舰版64位缺失tbb.dll文件

    win7旗舰版64位缺失tbb.dll文件 https://zhidao.baidu.com/question/688589990330312804.html 到好的电脑中复制一个,黏贴到下同的路径下 ...

  9. 【VIPM技巧】多版本LabVIEW无法连接问题

    前言 今天小编突然用到一个Toolkit,遂去VIPM上搜索,虽然可以找到但是无法连接成功LabVIEW,配置好一阵才解决.这里记录一下整个思路,供需要的人参考 问题记录 VIMP连接超时 问题解决 ...

  10. C#ActiveX控件开发

    1.新建项目,选择C#,选择.NET Framework2.0,新建一个Windows窗体控件库项目,命名为ActiveXDemo; 2.右击ActiveXDem项目,选择属性——应用程序——程序集信 ...