题目链接: 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 线段树 码力相关推荐

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

    这题纠结了两天,开始一点思路没有,后来看到有大牛把这题的做法称作区间树,并说明了区间树与线段树的区别(区间树是区间内被染色的区间标记为1,未被染色的区间标记为0).我觉得这就是线段树的一类操作,没有必 ...

  2. poj 2777 AND hdu 5316 线段树

    区间染色问题,用线段树可以解决.颜色总类不多,故考虑用二进制数的每一位表示一种颜色,然后父节点的颜色就是孩子节点颜色"或"起来,加上lazy标记,轻松AC. poj 2777: 1 ...

  3. POJ 1177 Picture [离散化+扫描线+线段树]

    http://poj.org/problem?id=1177 给若干矩形,求被覆盖的区域的周长. 将 y 坐标离散化后,按 x 坐标进行扫描.用线段树维护两个东西,当前竖线的叠加长度 len 和 条数 ...

  4. POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 53703   Accepted: 25237 ...

  5. POJ 2777 Count Color (线段树区间修改 + 状态压缩)

    题目链接:POJ 2777 Count Color [题目大意] 给你 n 块板子, 编号1--n , 板子的颜色最多30种, 初始时  板子的颜色都是 1: 有两种操作 1 .把给定区间的板子染成一 ...

  6. POJ——3624 Balanced Lineup(线段树入门——区间最值问题)

    原题链接:http://poj.org/problem?id=3264 每天挤奶时,农夫John的N头奶牛(1≤N≤50,000头)总是按照相同的顺序排列.一天,农夫约翰决定和几头牛组织一场极限飞盘游 ...

  7. POJ 2155 Matrix 二维线段树

    一开始还想跟一维一样用懒惰标记,死活搞不出,看到网上有人说二维的只能做到区间查询单点更新,或单点更新区间查询,用不了懒惰标记.释怀了... 用标记永久化,也就是说一个节点的标记不用往下传,从顶到下查询 ...

  8. poj 2985(并查集+线段树求K大数)

    解题思路:这道题并查集很容易,合并时找到父节点就直接加上去就ok了.关键是如何求K大数,我一直在想用线段树怎么写,一开始想如果直接记录数的大小那肯定是没戏了,借鉴了一下别人的思路:区间[a,b]记录的 ...

  9. poj 2528 Mayor's posters (线段树+离散化)

    /*离散化+线段树由于 数据的输入最大是 10000000 ,直接用开数组肯点会超,所以要将起离散话,首先 ,我们存储输入的边,将其离散化,后面的就和一般的线段树一样可. */#include< ...

  10. Poj 3246 Balanced Lineup(线段树基础)

    依旧是线段树基础题 询问区间的最大值和最小值之差,只有询问,没有插入删除.继续理解基础线段树 #include <iostream> #include <algorithm> ...

最新文章

  1. js调用ios和安卓方法
  2. multi agent system university of liverpool professional presentation
  3. 配置 docker0 网桥
  4. 对身体的挣脱与自足的想象:谈阿满的小说集《双花祭》
  5. Sigmatel37xx GPIO的使用
  6. 基于51单片机的八位流水灯(三种形式)
  7. JavaScript 图
  8. sqlite的数据库文件在什么地方? sqlite数据库文件后缀名,提取方法,打开方法。
  9. lintcode-微软笔试
  10. isis协议_[IS-IS] IS-IS路由协议的基本知识及配置
  11. 苹果电脑win10蓝牙音响卡顿_win10系统蓝牙音箱卡顿声音断断续续的处理办法
  12. dtm源码编译安装-运行客户端demo
  13. 台湾大学林轩田机器学习基石课程学习笔记9 -- Linear Regression
  14. 学计算机用游戏本好吗,学设计的用什么笔记本好呢
  15. CorelDRAW X8超低价优惠啦,你却还在用CDR X4破解?!
  16. 什么?Python的多进程居然比单进程慢?
  17. 当发现以前的自己是个傻逼时,该如何面对以后的人生
  18. 计算机组成原理平均cpi怎么算_计算机组成原理计算题
  19. python 读取csv文件转成字符串,python实现csv格式文件转为asc格式文件的方法
  20. 【NOIP1999普及组】Cantor表

热门文章

  1. Dockerfile 中的 CMD 与 ENTRYPOINT
  2. Nginx 反向代理解决浏览器跨域问题
  3. C#中string[]数组和liststring泛型的相互转换 【转】
  4. 关于鼓励软件产业和集成电路产业发展有关税收政策问题的通知
  5. docker使用官方仓库上传与下拉images
  6. 一个循环递归遍历问题
  7. 随着浏览器窗口缩小表格出现横向滚动条
  8. FindBugs-IDEA插件的使用
  9. JS内置对象练习(慕课网题目)
  10. struts2 s:file标签使用及文件上传例子