题目传送门

题意:四种集合的操作,对应区间的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的更多相关文章

  1. POJ 2528 ——Mayor's posters(线段树+区间操作)

    Time limit 1000 ms Memory limit 65536 kB Description The citizens of Bytetown, AB, could not stand t ...

  2. 线段树(区间合并) POJ 3667 Hotel

    题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...

  3. Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...

  4. POJ 3225 Help with Intervals --线段树区间操作

    题意:给你一些区间操作,让你输出最后得出的区间. 解法:区间操作的经典题,借鉴了网上的倍增算法,每次将区间乘以2,然后根据区间开闭情况做微调,这样可以有效处理开闭区间问题. 线段树维护两个值: cov ...

  5. 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,另一种操 ...

  6. HDU 4578——Transformation——————【线段树区间操作、确定操作顺序】

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

  7. 吉首大学校赛 K 白山茶与红玫瑰 (线段树区间操作)

    链接:https://ac.nowcoder.com/acm/contest/925/K来源:牛客网 题目描述 公元2019年6月22日,白山茶王国与红玫瑰王国展开大战,在世外仙境——天空花园处,双方 ...

  8. COJ 1010 WZJ的数据结构(十) 线段树区间操作

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1001 WZJ的数据结构(十) 难度级别:D: 运行时间限制:3000ms: ...

  9. poj3225 线段树区间操作 (见鬼)

    细节处理实在太重要了. #include<cstdio> #include<cstring> #define MT 65533*4 #define Maxn MT*4 int ...

随机推荐

  1. python基础——定制类

    python基础——定制类 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__len__()方 ...

  2. ios Push证书 转换步骤

    1.将aps_developer_identity.cer转换成aps_developer_identity.pem格式openssl x509 -in aps_developer_identity. ...

  3. Swift - 代码创建单例

    创建单例的方法 import UIKit //创建一个单例类 class SingleInstance: NSObject { //在单例类中,有一个用来共享数据的数组 var datas = [St ...

  4. NYOJ之Binary String Matching

    Binary String Matching 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述     Given two strings A and B, whose a ...

  5. 2.1顺序容器-vector

    vector 1) *   :使用vector必须包含vector头文件.可变长的动态数组,支持随机访问,所有STL算法都可以对vector进行操作. ** :随机根据下标访问某个元素的时间是一个常数 ...

  6. sql server 常用脚本(日常查询所需)

    1:查看sql server代理中作业的运行状况的脚本 -- descr : a simple sql script to view sql server jobs run status -- las ...

  7. 解决IIS7、IIS7.5中时间格式显示的问题

    今天在用IIS7的时候发现一个关于时间格式的问题,当我在ASP中使用now()时间函数的时候,日期是以"/"来分隔,而不是以"-"来分隔的,使得我在运行程序的时 ...

  8. 对Object类中方法的深入理解

    看一下API中关于Object的介绍: 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 那么Object中到底有哪些方法,各自有什 ...

  9. Android性能优化系列 + Android官方培训课程中文版

    Android性能优化典范 - 第6季 http://hukai.me/android-performance-patterns-season-6/   Android性能优化典范 - 第5季 htt ...

  10. Delphi线程简介---Create及其参数、Resume、Suspend

    TThread在Classes单元里的声明如下 type TThread = class private FHandle: THandle; FThreadID: THandle; FTerminat ...