待解决的问题 POJ 3225 Help with Intervals 线段树 码力
题目链接: http://poj.org/problem?id=3225
题目大意: 给出若干区间, 有五种操作方式(区间交, 并, 补等等), 求出最后的区间为多少
解题思路: 需要考虑的东西太多了, 代码也太复杂, 先记录下来, 以后在做
我们一个一个操作来分析:(用0和1表示是否包含区间,-1表示该区间内既有包含又有不包含)
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互换
成段覆盖的操作很简单,比较特殊的就是区间0/1互换这个操作,我们可以称之为异或操作
很明显我们可以知道这个性质:当一个区间被覆盖后,不管之前有没有异或标记都没有意义了
所以当一个节点得到覆盖标记时把异或标记清空
而当一个节点得到异或标记的时候,先判断覆盖标记,如果是0或1,直接改变一下覆盖标记,不然的话改变异或标记
开区间闭区间只要数字乘以2就可以处理(偶数表示端点,奇数表示两端点间的区间)
线段树功能:update:成段替换,区间异或 query:简单hash 转自: http://blog.csdn.net/metalseed/article/details/8039326
代码: 代码也是转自http://blog.csdn.net/metalseed/article/details/8039326
#include <cstdio> #include <cstring> #include <cctype> #include <algorithm> using namespace std; #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1const int maxn = 131072; bool hash1[maxn+1]; int cover[maxn<<2]; int XOR[maxn<<2]; void FXOR(int rt) {if (cover[rt] != -1) cover[rt] ^= 1;else XOR[rt] ^= 1; } void PushDown(int rt) {if (cover[rt] != -1) {cover[rt<<1] = cover[rt<<1|1] = cover[rt];XOR[rt<<1] = XOR[rt<<1|1] = 0;cover[rt] = -1;}if (XOR[rt]) {FXOR(rt<<1);FXOR(rt<<1|1);XOR[rt] = 0;} } void update(char op,int L,int R,int l,int r,int rt) {if (L <= l && r <= R) {if (op == 'U') {cover[rt] = 1;XOR[rt] = 0;} else if (op == 'D') {cover[rt] = 0;XOR[rt] = 0;} else if (op == 'C' || op == 'S') {FXOR(rt);}return ;}PushDown(rt);int m = (l + r) >> 1;if (L <= m) update(op , L , R , lson);else if (op == 'I' || op == 'C') {XOR[rt<<1] = cover[rt<<1] = 0;}if (m < R) update(op , L , R , rson);else if (op == 'I' || op == 'C') {XOR[rt<<1|1] = cover[rt<<1|1] = 0;} } void query(int l,int r,int rt) {if (cover[rt] == 1) {for (int it = l ; it <= r ; it ++) {hash1[it] = true;}return ;} else if (cover[rt] == 0) return ;if (l == r) return ;PushDown(rt);int m = (l + r) >> 1;query(lson);query(rson); } int main() {cover[1] = XOR[1] = 0;char op , l , r;int a , b;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 update(op , a , b , 0 , maxn , 1);}query(0 , maxn , 1);bool flag = false;int s = -1 , e;for (int i = 0 ; i <= maxn ; i ++) {if (hash1[i]) {if (s == -1) s = i;e = i;} else {if (s != -1) {if (flag) printf(" ");flag = true;printf("%c%d,%d%c",s&1?'(':'[' , s>>1 , (e+1)>>1 , e&1?')':']');s = -1;}}}if (!flag) printf("empty set");puts("");return 0; }
View Code
思考: 哎, still have a long way to go 啊..........
转载于:https://www.cnblogs.com/FriskyPuppy/p/7324785.html
待解决的问题 POJ 3225 Help with Intervals 线段树 码力相关推荐
- POJ 3225 Help with Intervals(线段树)
这题纠结了两天,开始一点思路没有,后来看到有大牛把这题的做法称作区间树,并说明了区间树与线段树的区别(区间树是区间内被染色的区间标记为1,未被染色的区间标记为0).我觉得这就是线段树的一类操作,没有必 ...
- poj 2777 AND hdu 5316 线段树
区间染色问题,用线段树可以解决.颜色总类不多,故考虑用二进制数的每一位表示一种颜色,然后父节点的颜色就是孩子节点颜色"或"起来,加上lazy标记,轻松AC. poj 2777: 1 ...
- POJ 1177 Picture [离散化+扫描线+线段树]
http://poj.org/problem?id=1177 给若干矩形,求被覆盖的区域的周长. 将 y 坐标离散化后,按 x 坐标进行扫描.用线段树维护两个东西,当前竖线的叠加长度 len 和 条数 ...
- POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 53703 Accepted: 25237 ...
- POJ 2777 Count Color (线段树区间修改 + 状态压缩)
题目链接:POJ 2777 Count Color [题目大意] 给你 n 块板子, 编号1--n , 板子的颜色最多30种, 初始时 板子的颜色都是 1: 有两种操作 1 .把给定区间的板子染成一 ...
- POJ——3624 Balanced Lineup(线段树入门——区间最值问题)
原题链接:http://poj.org/problem?id=3264 每天挤奶时,农夫John的N头奶牛(1≤N≤50,000头)总是按照相同的顺序排列.一天,农夫约翰决定和几头牛组织一场极限飞盘游 ...
- POJ 2155 Matrix 二维线段树
一开始还想跟一维一样用懒惰标记,死活搞不出,看到网上有人说二维的只能做到区间查询单点更新,或单点更新区间查询,用不了懒惰标记.释怀了... 用标记永久化,也就是说一个节点的标记不用往下传,从顶到下查询 ...
- poj 2985(并查集+线段树求K大数)
解题思路:这道题并查集很容易,合并时找到父节点就直接加上去就ok了.关键是如何求K大数,我一直在想用线段树怎么写,一开始想如果直接记录数的大小那肯定是没戏了,借鉴了一下别人的思路:区间[a,b]记录的 ...
- poj 2528 Mayor's posters (线段树+离散化)
/*离散化+线段树由于 数据的输入最大是 10000000 ,直接用开数组肯点会超,所以要将起离散话,首先 ,我们存储输入的边,将其离散化,后面的就和一般的线段树一样可. */#include< ...
- Poj 3246 Balanced Lineup(线段树基础)
依旧是线段树基础题 询问区间的最大值和最小值之差,只有询问,没有插入删除.继续理解基础线段树 #include <iostream> #include <algorithm> ...
最新文章
- js调用ios和安卓方法
- multi agent system university of liverpool professional presentation
- 配置 docker0 网桥
- 对身体的挣脱与自足的想象:谈阿满的小说集《双花祭》
- Sigmatel37xx GPIO的使用
- 基于51单片机的八位流水灯(三种形式)
- JavaScript 图
- sqlite的数据库文件在什么地方? sqlite数据库文件后缀名,提取方法,打开方法。
- lintcode-微软笔试
- isis协议_[IS-IS] IS-IS路由协议的基本知识及配置
- 苹果电脑win10蓝牙音响卡顿_win10系统蓝牙音箱卡顿声音断断续续的处理办法
- dtm源码编译安装-运行客户端demo
- 台湾大学林轩田机器学习基石课程学习笔记9 -- Linear Regression
- 学计算机用游戏本好吗,学设计的用什么笔记本好呢
- CorelDRAW X8超低价优惠啦,你却还在用CDR X4破解?!
- 什么?Python的多进程居然比单进程慢?
- 当发现以前的自己是个傻逼时,该如何面对以后的人生
- 计算机组成原理平均cpi怎么算_计算机组成原理计算题
- python 读取csv文件转成字符串,python实现csv格式文件转为asc格式文件的方法
- 【NOIP1999普及组】Cantor表