【线段树】POJ3225-Help with Intervals
---恢复内容开始---
【题目大意】
(直接引用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的更多相关文章
- 线段树 poj3225
U:把区间[l,r]覆盖成1I:把[-∞,l)(r,∞]覆盖成0 D:把区间[l,r]覆盖成0C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换S:[l,r]区间0/1互换 因 ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- poj 3225 Help with Intervals(线段树,区间更新)
Help with Intervals Time Limit: 6000MS Memory Limit: 131072K Total Submissions: 12474 Accepted: ...
- 2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树)
2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树) 传送门:https://nanti.jisuanke.com/t/41296 题意: 给一个数列A 问在数列A中有多 ...
- 线段树(区间操作) 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 ...
- POJ 3225 Help with Intervals --线段树区间操作
题意:给你一些区间操作,让你输出最后得出的区间. 解法:区间操作的经典题,借鉴了网上的倍增算法,每次将区间乘以2,然后根据区间开闭情况做微调,这样可以有效处理开闭区间问题. 线段树维护两个值: cov ...
- poj3225(线段树区间更新&hash)
题目链接: http://poj.org/problem?id=3225 题意: 初始给一个全局为 0~65536 的区间 s, 然后不断地对区间 s 进行 并, 交, 差, 相对差等运算, 输出最 ...
- 2018宁夏邀请赛 Continuous Intervals(单调栈 线段树
https://vjudge.net/problem/Gym-102222L 题意:给你n个数的序列,让判断有几个区间满足排完序后相邻两数差都不大于1. 题解:对于一个区间 [L,R],记最大值为 m ...
- [转载]完全版线段树 by notonlysuccess大牛
原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...
随机推荐
- python作业三级菜单day1(第一周)
一.作业需求: 1. 运行程序输出第一级菜单 2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单 3. 菜单数据保存在文件中 4. 让用户选择是否要退出 5. 有返回上一级菜单的功能 二三级菜单文 ...
- python之operator操作符函数
operator函数主要分为以下几类:对象比较.逻辑比较.算术运算和序列操作. 举例: #python 3.4 >>> operator.eq(1,2)False >>& ...
- C json实战引擎 二 , 实现构造部分
引言 这篇博文和前一篇 C json实战引擎一,实现解析部分设计是相同的,都是采用递归下降分析. 这里扯一点 假如你是学生 推荐一本书 给 大家 自制编程语言 http://baike.baidu.c ...
- JavaScript里的小妖精
JavaScript里的小妖精———this!! 关于this指向这个问题,活生生折磨了我一个下午,回来静下心捋顺一下,总结出来一下规律. 当然,this这个复杂的问题不是一句两句可以说清楚,作为菜鸟 ...
- [hadoop][会装]HBase集群安装--基于hadoop ha模式
可以参考部署HBase系统(分布式部署) 和基于无HA模式的hadoop下部署相比,主要是修改hbase-site .xml文件,修改如下参数即可: <property> <name ...
- leetcode 之Swap Nodes in Pairs(21)
不允许通过值来交换,在更新指针时需要小心. ListNode *swapNodes(ListNode* head) { ListNode dummy(-); dummy.next = head; fo ...
- Intersection of Two Linked Lists——经典问题
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
- qtp录制时间控件不允许用户手动输入的解决办法
qtp录制时间控件不允许用户手动输入的解决办法 [前面的话] 一边学习qtp,一边用自己的项目试着写代码,而遇到一个问题就会让自己卡壳很久,这次也是这样的,在写好了登录代码以后,自己就试着写第一个预订 ...
- 前端读者 | Javascript设计模式理论与实战:状态模式
本文来自 @狼狼的蓝胖子:链接:http://luopq.com/2015/11/25/design-pattern-state/ 在软件开发中,很大部分时候就是操作数据,而不同数据下展示的结果我们将 ...
- C++中正确使用PRId64
http://blog.csdn.net/win_lin/article/details/7912693