POJ 3225
基本参考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的更多相关文章
- ●线段树的三个题(poj 3225,hdu 1542,hdu 1828)
●poj 3225 Help with Intervals(线段树区间问题) ○赘述题目 给出以下集合操作: 然后有初始的一个空集S,和以下题目给出的操作指令,并输入指令: 要求进行指令操作后,按格式 ...
- POJ 3225 Help with Intervals(线段树)
POJ 3225 Help with Intervals 题目链接 集合数字有的为1,没有为0,那么几种操作相应就是置为0或置为1或者翻转,这个随便推推就能够了,然后开闭区间的处理方式就是把区间扩大成 ...
- poj 3225 【线段树】
poj 3225 这题是用线段树解决区间问题,看了两天多,算是理解一点了. Description LogLoader, Inc. is a company specialized in provid ...
- poj 3225 间隙(横截面和填充操作)
http://poj.org/problem?id=3225 一道题又做了一天. .这道题对我来说起初有N多难点. 1:区间的开闭怎样解决. . 2:如何把区间的交并补.对称差转化为对线段树的操作. ...
- poj - 3225 Roadblocks(次短路)
http://poj.org/problem?id=3255 bessie 有时会去拜访她的朋友,但是她不想走最快回家的那条路,而是想走一条比最短的路长的次短路. 城镇由R条双向路组成,有N个路口.标 ...
- poj 3225 Help with Intervals(线段树,区间更新)
Help with Intervals Time Limit: 6000MS Memory Limit: 131072K Total Submissions: 12474 Accepted: ...
- POJ 3225 Help with Intervals --线段树区间操作
题意:给你一些区间操作,让你输出最后得出的区间. 解法:区间操作的经典题,借鉴了网上的倍增算法,每次将区间乘以2,然后根据区间开闭情况做微调,这样可以有效处理开闭区间问题. 线段树维护两个值: cov ...
- poj 3225 线段树+位运算
略复杂的一道题,首先要处理开闭区间问题,扩大两倍即可,注意输入最后要\n,初始化不能随便memset 采用线段树,对线段区间进行0,1标记表示该区间是否包含在s内U T S ← S ∪ T 即将[l, ...
- 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]区间 ...
- POJ 3225 (线段树 区间更新) Help with Intervals
这道题搞了好久,其实坑点挺多.. 网上找了许多题解,发现思路其实都差不多,所以就不在重复了. 推荐一篇比较好的题解,请戳这. 另外,如果因为可能要更新多次,但最终查询只需要一次,所以没有写pushup ...
随机推荐
- Python的学习(二十一)----Python的静态变量
前段时间在论坛里面有人提问说, class foo(): member1 member2 ... self.member1 foo.member2 其中的两个成员member1, member2有什么 ...
- 0423-mysql插入语句大全
/*注意: 1.字段和值要一一对应 2.值的数据类型是字段的数据类型 3.当输入的字段是表中全部字段时,字段可以省略不写: insert into login values ('zhangsan',‘ ...
- 洛谷 P2986 [USACO10MAR]Great Cow Gat…(树形dp+容斥原理)
P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat… 题目描述 Bessie is planning the annual Great Cow Gathering for c ...
- bzoj1030 文本生成器(AC自动机+dp)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4777 Solved: 1986[Submit][Stat ...
- 题解报告:hdu 1850 Being a Good Boy in Spring Festival(尼姆博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1850 Problem Description 一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里 ...
- HBase编程 API入门系列之delete(客户端而言)(3)
心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. 前面的基础,如下 HBase编程 API入门系列之put(客户端而言)(1) HBase编程 API入门系列之get(客户端而言) ...
- C#之调用存储过程
C#调用存储过程 以下内容可能有错漏之处,请大家多多指教. C#后台代码如下: //调用存储过程的方法public static void Startupworkflow(string first ...
- 5.26 Quartz任务调度图解2
- Oracle 当输入参数允许为空时
场景: 有一个存储过程p_test 带有多个输入参数code.name.number p_test(code IN VARCHAR2,nameIN VARCHAR2,number IN VARCHAR ...
- 【Oracle】恢复重做日志组
我们在Oracle的日常运维中,有可能会遇到重做日志组丢失的情况.下面我将模拟丢失不同状态的日志组,并分别给出解决办法: 重做日志有以下几种状态,如下: - CURRENT:此状态表示正在被 LGW ...