基本参考http://blog.csdn.net/metalseed/article/details/8039326

总的来说,敲完一遍理解会更加好一点,标记下传法。

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互换

利用异或值来决定是否要翻转,注意标记下传时,孩子结点的值是否要翻转是根据父结点决定的。由于最新的状态是在最上层完成的,所以后代结点翻转状态基本没有,除了当父结点覆盖状态为-1(此时区间内部分子区间值为1),需要结合父结点来决定当前的异或值。

#include <cstdio>
#include <cstring>
#include <cctype>
#include <iostream>
#include <algorithm>
using namespace std; const int maxn = ;
bool hash[maxn+];
int cover[maxn<<];
int XOR[maxn<<]; void PushXOR(int rt){
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]=-;
}
if(XOR[rt]){
PushXOR(rt<<);
PushXOR(rt<<|);
XOR[rt]=;
}
} 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=='C'||op=='S'){
PushXOR(rt);
}
return ;
}
PushDown(rt);
int m=(l+r)>>;
if(L<=m) update(op,L,R,l,m,rt<<);
else if(op=='I'||op=='C'){ cover[rt<<]=XOR[rt<<]=; }
if(m<R) update(op,L,R,m+,r,rt<<|);
else if(op=='I'||op=='C'){ cover[rt<<|]=XOR[rt<<|]=; }
} void query(int l,int r,int rt){
if(cover[rt]!=-){
if(cover[rt]>){
for(int i=l;i<=r;i++)
hash[i]=true;
}
return ;
}
if(l==r) return ;
PushDown(rt);
int m=(l+r)>>;
query(l,m,rt<<);
query(m+,r,rt<<|);
} int main(){
cover[] = XOR[] = ;
char op , l , r;
int a , b;
// int tt=0;
while (scanf("%c %c%d,%d%c",&op , &l , &a , &b , &r)!=EOF) {
getchar();
// tt++;
a <<= , b <<= ;
if (l == '(') a ++;
if (r == ')') b --;
if (a > b) {
if (op == 'C' || op == 'I') {
cover[] = XOR[] = ;
}
}
else update(op , a , b , , maxn , );
// if(tt==5) break;
}
memset(hash,false,sizeof(hash));
query(,maxn,);
bool flag = false;
int s = - , e;
for (int i = ; i <= maxn ; i ++) {
if (hash[i]) {
if (s == -) s = i;
e = i;
} else {
if (s != -) {
if (flag) printf(" ");
flag = true;
printf("%c%d,%d%c",s&?'(':'[' , s>> , (e+)>> , e&?')':']');
s = -;
}
}
}
if (!flag) printf("empty set");
puts("");
return ;
}

POJ 3225的更多相关文章

  1. ●线段树的三个题(poj 3225,hdu 1542,hdu 1828)

    ●poj 3225 Help with Intervals(线段树区间问题) ○赘述题目 给出以下集合操作: 然后有初始的一个空集S,和以下题目给出的操作指令,并输入指令: 要求进行指令操作后,按格式 ...

  2. POJ 3225 Help with Intervals(线段树)

    POJ 3225 Help with Intervals 题目链接 集合数字有的为1,没有为0,那么几种操作相应就是置为0或置为1或者翻转,这个随便推推就能够了,然后开闭区间的处理方式就是把区间扩大成 ...

  3. poj 3225 【线段树】

    poj 3225 这题是用线段树解决区间问题,看了两天多,算是理解一点了. Description LogLoader, Inc. is a company specialized in provid ...

  4. poj 3225 间隙(横截面和填充操作)

    http://poj.org/problem?id=3225 一道题又做了一天. .这道题对我来说起初有N多难点. 1:区间的开闭怎样解决. . 2:如何把区间的交并补.对称差转化为对线段树的操作. ...

  5. poj - 3225 Roadblocks(次短路)

    http://poj.org/problem?id=3255 bessie 有时会去拜访她的朋友,但是她不想走最快回家的那条路,而是想走一条比最短的路长的次短路. 城镇由R条双向路组成,有N个路口.标 ...

  6. poj 3225 Help with Intervals(线段树,区间更新)

    Help with Intervals Time Limit: 6000MS   Memory Limit: 131072K Total Submissions: 12474   Accepted:  ...

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

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

  8. poj 3225 线段树+位运算

    略复杂的一道题,首先要处理开闭区间问题,扩大两倍即可,注意输入最后要\n,初始化不能随便memset 采用线段树,对线段区间进行0,1标记表示该区间是否包含在s内U T S ← S ∪ T 即将[l, ...

  9. POJ 3225 Help with Intervals

    U:把区间[l,r]覆盖成1I:把[0,l-1][r+1,∞]覆盖成0D:把区间[l,r]覆盖成0C:把[0,l-1][r+1,∞]覆盖成0 , 且[l,r]区间0/1互换(即异或)S:[l,r]区间 ...

  10. POJ 3225 (线段树 区间更新) Help with Intervals

    这道题搞了好久,其实坑点挺多.. 网上找了许多题解,发现思路其实都差不多,所以就不在重复了. 推荐一篇比较好的题解,请戳这. 另外,如果因为可能要更新多次,但最终查询只需要一次,所以没有写pushup ...

随机推荐

  1. Bayesian Regression

    Thus we see that there are very close similarities between this Bayesian viewpoint and the conventio ...

  2. go 函数高级运用

    一.函数作用域 说明 作用域的定义:已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围 在说函数作用域之前,先简单说一下局部变量和局变量 简单的说: 全局变量:在一个文件中,任何地方都 ...

  3. BZOJ 2101 DP+优化

    思路: http://www.cnblogs.com/exponent/archive/2011/08/14/2137849.html f[i,i+len]=sum[i,i+len]-min(f[i+ ...

  4. RabbitMQ 官方NET教程(五)【Topic】

    在上一个教程中,我们改进了我们的日志记录系统.我们使用direct类型转发器,使得接收者有能力进行选择性的接收日志,,而非fanout那样,只能够无脑的转发 虽然使用direct类型改进了我们的系统, ...

  5. elasticearch 归并策略

    归并线程配置 segment 归并的过程,需要先读取 segment,归并计算,再写一遍 segment,最后还要保证刷到磁盘.可以说,这是一个非常消耗磁盘 IO 和 CPU 的任务.所以,ES 提供 ...

  6. JavaScript Array 整理 - 元素操作

    整理一下Array对象中针对元素操作的方法. 分别是: concat (组合数组) join(数组转字符串) pop(删除最后一个元素) shift(删除第一个元素) push(在数组尾部添加新元素) ...

  7. 【Arduino】LCD 1602 转接板 的默认接线

    原来的1602屏需要7个IO口才能驱动起来LCD 1602转接板可以帮你省5个IO口. 在Arduino中,LCD 1602 转接板可以使用函数库LiquidCrystal_I2C1602: 该函数的 ...

  8. Android MediaRecorder自定义分辨率

    Android MediaRecorder自定义分辨率 工作这么久了,确实积累了不少东西,但都是以文档的形式存在U盘里的,为什么不写博客呢?因为懒啊!!!总感觉博客太难写了(大概是上学时候写作文恐惧症 ...

  9. Android开发笔记(13)——ListFragment

    转载请注明:http://www.cnblogs.com/igoslly/p/6959108.html ListFragment ListFragment是继承于Fragment的类,专门用于包含Li ...

  10. 省市区县的sql语句——区县

    DROP TABLE IF EXISTS `area`; CREATE TABLE `area` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `code` va ...