线段树(区间操作) 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 ...
随机推荐
- Java自定义注解开发
一.背景 最近在自己搞一个项目时,遇到可需要开发自定义注解的需求,对于没有怎么关注这些java新特性的来说,比较尴尬,索性就拿出一些时间,来进行研究下自定义注解开发的步骤以及使用方式.今天在这里记下, ...
- C 替换字符方法--1
#include "stdafx.h" //linux 底下要去掉这一行 #include <stdio.h> #include<stdlib.h> #in ...
- zmq-ios framwork
1.附件见zeromq-ios.framework百度网盘/iOS/zmq 2.zeromq-ios.framework解压拖进工程文件 3.objc-zmq见百度网盘/iOS/zmq 4.objc- ...
- Xcode 7如何免费真机调试iOS应用
Xcode 7如何免费真机调试iOS应用的简单方式: 运行Xcode后,点击菜单中的Preferences…进入Accounts标签,这里选择添加Apple ID:在弹出的对话框中登入你的Apple ...
- C/C++学习笔记---高地址、低地址、大段字节序、小段字节序
字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序. 小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处: 大端字节序是高字节数据存放在低地址 ...
- ***LINUX添加PHP环境变量:CentOS下将php和mysql命令加入到环境变量中
CentOS系统下如何将PHP和mysql命令加入到环境变量中,在Linux CentOS系统上 安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到 ...
- ytu 1061: 从三个数中找出最大的数(水题,模板函数练习 + 宏定义练习)
1061: 从三个数中找出最大的数 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 124[Submit][Status][We ...
- 使用html5 canvas绘制图片
注意:本文属于<html5 Canvas绘制图形入门详解>系列文章中的一部分.如果你是html5初学者,仅仅阅读本文,可能无法较深入的理解canvas,甚至无法顺畅地通读本文.请点击上述链 ...
- [Nodejs]十分钟快速编写简单静态文件服务器
学了几天Nodejs 后我又干上了前端的活.这次遇到的问题是,我想在不同的设备上方便的查看我编写的网页,很自然的就想到要是能在本地搭建一个简单的http服务器的话,那局域网内的所有设备都可以访问了,这 ...
- NBU bplabel命令擦除磁帶數據
bplabel Linux系統,該命令位於NBU server的如下目錄:/usr/openv/netbackup/bin/admincmd bplabel – write NetBackup lab ...