POJ3225Help with Intervals
来源:互联网 发布:打印机软件 编辑:程序博客网 时间:2024/09/21 08:19
开始没看懂题,看懂了之后也不知道如何用线段树来做这题,百度了一下思路
思路:
我们一个一个操作来分析:(用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互换
还有要注意的地方是把数组开为2倍,才可以用节点表示区间;注意a为0时的情况
#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <climits>#include <string>#include <iostream>#include <map>#include <cstdlib>#include <list>#include <set>#include <queue>#include <stack>using namespace std;#define INF 0xfffffff#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define maxn 132000int col[maxn<<2];void pushdown(int rt){ if(col[rt]==2) { col[rt<<1]=1-col[rt<<1]; col[rt<<1|1]=1-col[rt<<1|1]; col[rt]=-1; } if(col[rt]!=-1) { col[rt<<1]=col[rt<<1|1]=col[rt]; col[rt]=-1; }}void update(int L,int R,int add,int l,int r,int rt){ if(L<=l&&R>=r) { if(add==2) col[rt]=1-col[rt]; else col[rt]=add; return ; } pushdown(rt); int m=(l+r)>>1; if(L<=m) update(L,R,add,lson); if(R>m) update(L,R,add,rson);}int query(int key,int l,int r,int rt){ if(l==r) return col[rt]; pushdown(rt); int m=(l+r)>>1; if(key<=m) query(key,lson); else query(key,rson);}int main(){ char operation,bracket1,bracket2,nullity; int a,b; memset(col,0,sizeof(col)); while(scanf(" %c %c%d %c%d %c",&operation,&bracket1,&a,&nullity,&b,&bracket2)!=-1) { a=a<<1; b=b<<1; if(bracket1=='(') a++; if(bracket2==')') b--; if(operation=='U') { update(a,b,1,0,maxn,1); } else if(operation=='I') { if(a<=0) a=1; update(0,a-1,0,0,maxn,1); update(b+1,maxn,0,0,maxn,1); } else if(operation=='D') { update(a,b,0,0,maxn,1); } else if(operation=='C') { update(a,b,2,0,maxn,1); if(a<=0) a=1; update(0,a-1,0,0,maxn,1); update(b+1,maxn,0,0,maxn,1); } else if(operation=='S') { update(a,b,2,0,maxn,1); } } int flag=1,num=0; for(int i=0;i<maxn;i++) { int k=query(i,0,maxn,1); if(k&&flag) { num++; flag=0; if(i&1) printf("(%d,",i>>1); else printf("[%d,",i>>1); } if(!flag&&!k) { flag=1; i--; if(i&1) printf("%d) ",(i+1)>>1); else printf("%d] ",(i+1)>>1); } } if(!num) printf("empty set\n"); return 0;}
0 0
- POJ3225Help with Intervals
- POJ3225--Help with Intervals
- poj3225 Help with Intervals
- 3225 Help with Intervals
- poj3225 Help with Intervals
- 【poj3225】Help with Intervals
- POJ3225 Help with Intervals
- 【LeetCode with Python】 Merge Intervals
- POJ 3225 - Help with Intervals
- POJ 3225 - Help with Intervals
- POJ 3225 Help with Intervals
- Poj 3225 Help with Intervals
- POJ 3225 Help with Intervals
- POJ 3225 Help with Intervals
- poj-3225-Help with Intervals
- POJ-3225 Help with Intervals
- poj 3225 Help with Intervals
- poj 3225 Help with Intervals
- 矩阵的快速幂
- LeetCode Maximum Subarray
- 从QQ登录的js sdk中,研究html、css以及js的解耦
- java中IO流总结之五:RandomAccessFile类的用法总结
- Linux下64位weblogic11g的安装
- POJ3225Help with Intervals
- I2S音频总线学习(一)数字音频技术
- poj 3744
- cocos2d-js中Chipmunk物理引擎相关(1)
- bash: ./vartest.sh: /bin/sh^M: bad interpreter: No such file or directory
- java 中 IO流 总结之一: IO概述和File文件
- 新版linux系统设备架构中关于电源管理方式的变更
- java 中IO流总结之二 :字符流总结
- for循环