题目传送门

题意:四种集合的操作,对应区间的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. UISrollView

    1.  contentOffset 默认CGPointZero,用来设置scrollView的滚动偏移量. // 设置scrollView的滚动偏移量 scrollView.contentOffset ...

  2. ios滑动手势全屏(这段代码实现了下一级控制器滑到上一级控制器)

    在自定义导航控制器里面加以下代码就增加全屏滑动手势 >推向前一个控制器 //  HBNavigationController.m // #import "HBNavigationCon ...

  3. centOS目录结构

    rpm包到  /usr/bin/dirName 二进制包(需要解压 -> 生成配置文件 -> make(编译) -> 安装)放到 /usr/local/src/** mongodb ...

  4. CityEngine基于规则贴图的实现技巧

    转自:http://blog.sina.com.cn/s/blog_841eeb5201010p3e.html CityEngine在贴图的实现过程有两种方式:第一种是通过i(geometryPath ...

  5. Mysql 调用存储过程的两种方式

    一,使用call语句: 如:创建 call 调用: 使用占位符,通过prepare,execute调用:

  6. C 替换字符方法--1

    #include "stdafx.h" //linux 底下要去掉这一行 #include <stdio.h> #include<stdlib.h> #in ...

  7. python 中time模块使用

    在开始之前,首先要说明这几点: 1.在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主 ...

  8. Android Support兼容包详解

    原文:http://www.open-open.com/lib/view/open1427852683115.html

  9. Java并发编程实现概览

    并发概览 >>同步 如何同步多个线程对共享资源的访问是多线程编程中最基本的问题之一.当多个线程并发访问共享数据时会出现数据处于计算中间状态或者不一致的问题,从而影响到程序的正确运行.我们通 ...

  10. WiFi基本知识

    转自:http://blog.csdn.net/myarrow/article/details/7930131 1. IE802.11简介 标准号 IEEE 802.11b IEEE 802.11a ...