基本参考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. E20170902-hm

    devise v. 设计; 想出; 发明; 策划;   n. 遗赠; 遗赠的财产; 遗赠的条款; device n. 设备  

  2. go-swagger的简单使用

    一.下载go-swagger go-swagger 官方下载 根据不同个的操作系统选择对应的 二.添加环境变量 2.1 window swagger_windows_amd64.exe 将swagge ...

  3. oen /var/run/nginx.pid failed

    nginx: [error] open() "/var/run/nginx.pid" failed (2: No such file or directory) [root@TES ...

  4. 辨析 singleton 和 prototype

    <bean id="person1" class="com.bean.life.Person"> <property name="n ...

  5. POJ 3481 set水过

    题意:1表示插入客户K,他的优先级是P(相当于大小),2表示输出当前优先级最高的客户(即找出最大值),并且删除.3同理输出最低级的. 这题可以用splay treap AVL SBT -- (可是我并 ...

  6. # Nginx设置浏览器缓存

    配置语法 在location或if段里,来写. 格式 expires 30s; expires 30m; expires 2h; expires 30d; (注意:服务器的日期要准确,如果服务器的日期 ...

  7. rabbitmq镜像模式初体验

    rabbitmq-01: yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm wget ...

  8. Windows7环境下Composer 安装包的Cache目录位置

    http://segmentfault.com/a/1190000000355928 https://getcomposer.org/doc/ 要说Composer的用法,以后再说,现在只记录wind ...

  9. dubbo之只订阅及只注册

    只订阅 问题 如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务,所以需要将服务同时注册到两个注册中心,但却 ...

  10. 2星|《工业X.0》:物联网的资料汇编

    工业X.0:实现工业领域数字价值 看完比较失望,没有看到新的观点想法.基本算是物联网的资料汇编.总体评价2星. 以下是书中一些内容的摘抄: 1:例如,埃森哲为其员工开发了一个用例,用增强现实技术解决实 ...