【线段树】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/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...
随机推荐
- 对象方法、类方法、原型方法 && 私有属性、公有属性、公有静态属性
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- python中的binascii模块
binascii模块拿来干嘛的? 答:进制转换xxoo #!/usr/bin/env python # encoding:utf-8 # by i3ekr import binascii s = &q ...
- 自己动手实现arm函数栈帧回溯【转】
转自:http://blog.csdn.net/dragon101788/article/details/18668505 内核版本:2.6.14 glibc版本:2.3.6 CPU平台:arm gl ...
- 448D - Codeforces
D. Multiplication Table time limit per test 1 second memory limit per test 256 megabytes Bizon the C ...
- 004 ConcurrentHashMap原理
下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为 ...
- MyBatis根据数组、集合查询
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有item,index,collection,open,separator,close.it ...
- tornado样板
python tornado 样版 (包含出错页面) 2018-02-27 13:07:30 1 # -*- coding:utf-8 -*- 2 3 import tornado.web 4 i ...
- Windows下修改oracle实例不随服务自动启动
设置Oracle Administration Assistant for Windows 开始->所有程序->Oracle - OraDb10g_home1->配置和移植工具-&g ...
- django开发项目实例2--如何链接图片和css文件(静态文件)
在上一篇随笔里面,我们已经介绍了如何从零开始用django建立一个项目并且初步运行以来了, 现在我们就要开始写我们的html了,也就是django里面的模板了,不过这节我们只讲如何链接图片和css(静 ...
- 魔法上网之Ubuntu部署“酸酸”
“酸酸”,即s*h*a*d*o*w*s*o*c*k*s,用于魔法上网,用python写成. 在ubuntu环境下,用pip包管理工具可以非常方便地安装“酸酸”服务:ssserver. 先安装pip(假 ...