线段树(区间操作) 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, l), (r, N]填充0并且[l, r]xor; S T [l, r]xor
线段树结点两个属性,cover[o]: 该区间是否填充(1, 0, -1),_xor[o]: 该区间是否异或反转(1, 0)。最后(和[的区别可以原数*2判奇偶得
#include <cstdio>
#include <cstring>
#include <algorithm> #define lson l, mid, o << 1
#define rson mid + 1, r, o << 1 | 1
typedef long long ll;
const int N = 2 * 65535 + 5;
bool vis[N];
int cover[N<<2], _xor[N<<2]; void Xor(int o) {
if (cover[o] != -1) {
cover[o] ^= 1;
} else {
_xor[o] ^= 1;
}
}
void push_down(int o) {
if (cover[o] != -1) {
cover[o<<1] = cover[o<<1|1] = cover[o];
_xor[o<<1] = _xor[o<<1|1] = 0;
cover[o] = -1;
}
if (_xor[o]) {
Xor (o<<1);
Xor (o<<1|1);
_xor[o] = 0;
}
}
void updata(int ql, int qr, char op, int l, int r, int o) {
if (ql <= l && r <= qr) {
if (op == 'U') {
cover[o] = 1;
_xor[o] = 0;
} else if (op == 'D') {
cover[o] = _xor[o] = 0;
} else if (op == 'C' || op == 'S') {
Xor (o);
}
return ;
}
push_down (o);
int mid = l + r >> 1;
if (ql <= mid) {
updata (ql, qr, op, lson);
} else if (op == 'I' || op == 'C') {
cover[o<<1] = _xor[o<<1] = 0;
}
if (qr > mid) {
updata (ql, qr, op, rson);
} else if (op == 'I' || op == 'C') {
cover[o<<1|1] = _xor[o<<1|1] = 0;
}
}
void query(int l, int r, int o) {
if (cover[o] == 1) {
for (int i=l; i<=r; ++i) {
vis[i] = true;
}
return ;
} else if (cover[o] == 0) {
return ;
}
if (l == r) {
return ;
}
push_down (o);
int mid = l + r >> 1;
query (lson);
query (rson);
} int main() {
char op, l, r; int a, b;
int n = N - 5;
cover[1] = cover[1] = 0;
while (~scanf ("%c %c%d,%d%c\n", &op, &l, &a, &b, &r)) {
a <<= 1; b <<= 1;
if (l == '(') {
a++;
}
if (r == ')') {
b--;
}
if (a > b) {
if (op == 'C' || op == 'I') {
cover[1] = _xor[1] = 0;
}
} else {
updata (a, b, op, 0, n, 1);
}
}
memset (vis, false, sizeof (vis));
query (0, n, 1);
bool flag = false;
int s = -1, e = 0;
for (int i=0; i<=n; ++i) {
if (vis[i]) {
if (s == -1) {
s = i;
}
e = i;
} else {
if (s != -1) {
if (flag) putchar (' ');
flag = true;
printf ("%c%d,%d%c", s&1 ? '(' : '[', s>>1, (e+1)>>1, e&1 ? ')' : ']');
s = -1;
}
}
}
if (flag) {
puts ("");
} else {
puts ("empty set");
} return 0;
}
线段树(区间操作) POJ 3325 Help with Intervals的更多相关文章
- POJ 2528 ——Mayor's posters(线段树+区间操作)
Time limit 1000 ms Memory limit 65536 kB Description The citizens of Bytetown, AB, could not stand t ...
- 线段树(区间合并) POJ 3667 Hotel
题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...
- Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...
- POJ 3225 Help with Intervals --线段树区间操作
题意:给你一些区间操作,让你输出最后得出的区间. 解法:区间操作的经典题,借鉴了网上的倍增算法,每次将区间乘以2,然后根据区间开闭情况做微调,这样可以有效处理开闭区间问题. 线段树维护两个值: cov ...
- HDU - 6315(2018 Multi-University Training Contest 2) Naive Operations (线段树区间操作)
http://acm.hdu.edu.cn/showproblem.php?pid=6315 题意 a数组初始全为0,b数组为1-n的一个排列.q次操作,一种操作add给a[l...r]加1,另一种操 ...
- HDU 4578——Transformation——————【线段树区间操作、确定操作顺序】
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
- 吉首大学校赛 K 白山茶与红玫瑰 (线段树区间操作)
链接:https://ac.nowcoder.com/acm/contest/925/K来源:牛客网 题目描述 公元2019年6月22日,白山茶王国与红玫瑰王国展开大战,在世外仙境——天空花园处,双方 ...
- COJ 1010 WZJ的数据结构(十) 线段树区间操作
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1001 WZJ的数据结构(十) 难度级别:D: 运行时间限制:3000ms: ...
- poj3225 线段树区间操作 (见鬼)
细节处理实在太重要了. #include<cstdio> #include<cstring> #define MT 65533*4 #define Maxn MT*4 int ...
随机推荐
- python基础——定制类
python基础——定制类 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__len__()方 ...
- ios Push证书 转换步骤
1.将aps_developer_identity.cer转换成aps_developer_identity.pem格式openssl x509 -in aps_developer_identity. ...
- Swift - 代码创建单例
创建单例的方法 import UIKit //创建一个单例类 class SingleInstance: NSObject { //在单例类中,有一个用来共享数据的数组 var datas = [St ...
- NYOJ之Binary String Matching
Binary String Matching 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Given two strings A and B, whose a ...
- 2.1顺序容器-vector
vector 1) * :使用vector必须包含vector头文件.可变长的动态数组,支持随机访问,所有STL算法都可以对vector进行操作. ** :随机根据下标访问某个元素的时间是一个常数 ...
- sql server 常用脚本(日常查询所需)
1:查看sql server代理中作业的运行状况的脚本 -- descr : a simple sql script to view sql server jobs run status -- las ...
- 解决IIS7、IIS7.5中时间格式显示的问题
今天在用IIS7的时候发现一个关于时间格式的问题,当我在ASP中使用now()时间函数的时候,日期是以"/"来分隔,而不是以"-"来分隔的,使得我在运行程序的时 ...
- 对Object类中方法的深入理解
看一下API中关于Object的介绍: 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 那么Object中到底有哪些方法,各自有什 ...
- Android性能优化系列 + Android官方培训课程中文版
Android性能优化典范 - 第6季 http://hukai.me/android-performance-patterns-season-6/ Android性能优化典范 - 第5季 htt ...
- Delphi线程简介---Create及其参数、Resume、Suspend
TThread在Classes单元里的声明如下 type TThread = class private FHandle: THandle; FThreadID: THandle; FTerminat ...