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

【题目大意】

(直接引用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. python作业三级菜单day1(第一周)

    一.作业需求: 1. 运行程序输出第一级菜单 2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单 3. 菜单数据保存在文件中 4. 让用户选择是否要退出 5. 有返回上一级菜单的功能 二三级菜单文 ...

  2. python之operator操作符函数

    operator函数主要分为以下几类:对象比较.逻辑比较.算术运算和序列操作. 举例: #python 3.4 >>> operator.eq(1,2)False >>& ...

  3. C json实战引擎 二 , 实现构造部分

    引言 这篇博文和前一篇 C json实战引擎一,实现解析部分设计是相同的,都是采用递归下降分析. 这里扯一点 假如你是学生 推荐一本书 给 大家 自制编程语言 http://baike.baidu.c ...

  4. JavaScript里的小妖精

    JavaScript里的小妖精———this!! 关于this指向这个问题,活生生折磨了我一个下午,回来静下心捋顺一下,总结出来一下规律. 当然,this这个复杂的问题不是一句两句可以说清楚,作为菜鸟 ...

  5. [hadoop][会装]HBase集群安装--基于hadoop ha模式

    可以参考部署HBase系统(分布式部署) 和基于无HA模式的hadoop下部署相比,主要是修改hbase-site .xml文件,修改如下参数即可: <property> <name ...

  6. leetcode 之Swap Nodes in Pairs(21)

    不允许通过值来交换,在更新指针时需要小心. ListNode *swapNodes(ListNode* head) { ListNode dummy(-); dummy.next = head; fo ...

  7. Intersection of Two Linked Lists——经典问题

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  8. qtp录制时间控件不允许用户手动输入的解决办法

    qtp录制时间控件不允许用户手动输入的解决办法 [前面的话] 一边学习qtp,一边用自己的项目试着写代码,而遇到一个问题就会让自己卡壳很久,这次也是这样的,在写好了登录代码以后,自己就试着写第一个预订 ...

  9. 前端读者 | Javascript设计模式理论与实战:状态模式

    本文来自 @狼狼的蓝胖子:链接:http://luopq.com/2015/11/25/design-pattern-state/ 在软件开发中,很大部分时候就是操作数据,而不同数据下展示的结果我们将 ...

  10. C++中正确使用PRId64

    http://blog.csdn.net/win_lin/article/details/7912693