NKOI 2295 涂色
2016-07-11 16:56
429 查看
涂色
Time Limit:10000MS Memory Limit:165536K
Total Submit:158 Accepted:97
Case Time Limit:1000MS
Description
在数轴上进行一系列操作。每次操作有两种类型,一种是在线段[a,b]上涂上颜色,另一种将[a,b]上的颜色擦去。
问经过一系列的操作后,有多少条单位线段[k,k+1]被涂上了颜色。
Input
第一行,一个整数n,表示总的操作数
以后n行输入三个整数(n<=100000)。
第一个数为1表示涂色,0表示擦去。
第二、三个数表示线段[a,b](1<=a<b<=200000)。
Output
有多少条单位线段[k,k+1]被涂上了颜色。
Sample Input
Sample Output
这里将叶子节点换成单位线段更容易讨论
我们增加一个lazy参数,Lazy=1表示擦除,Lazy=2表示涂色
Time Limit:10000MS Memory Limit:165536K
Total Submit:158 Accepted:97
Case Time Limit:1000MS
Description
在数轴上进行一系列操作。每次操作有两种类型,一种是在线段[a,b]上涂上颜色,另一种将[a,b]上的颜色擦去。
问经过一系列的操作后,有多少条单位线段[k,k+1]被涂上了颜色。
Input
第一行,一个整数n,表示总的操作数
以后n行输入三个整数(n<=100000)。
第一个数为1表示涂色,0表示擦去。
第二、三个数表示线段[a,b](1<=a<b<=200000)。
Output
有多少条单位线段[k,k+1]被涂上了颜色。
Sample Input
输入样例1: 5 1 1 15 0 4 9 1 7 18 1 7 9 0 1 3 输入样例2: 4 1 1 8 0 4 8 1 7 8 0 1 3
Sample Output
输出样例1: 12 输出样例2: 2
这里将叶子节点换成单位线段更容易讨论
我们增加一个lazy参数,Lazy=1表示擦除,Lazy=2表示涂色
#include<cstdio> #include<iostream> using namespace std; int n,a,b,k,tot; const int maxn=200005; struct wk{int a,b,left,right,lazy;}tree[4*maxn]; inline void _read(int &x){ char t=getchar();bool sign=true; while(t<'0'||t>'9') {if(t=='-')sign=false;t=getchar();} for(x=0;t>='0'&&t<='9';t=getchar())x=x*10+t-'0'; if(!sign)x=-x; } void buildtree(int x,int y){ int r=++tot; tree[r].a=x;tree[r].b=y; if(x+1<y){ int mid=(x+y)>>1; tree[r].left=tot+1; buildtree(x,mid); tree[r].right=tot+1; buildtree(mid,y); }//为了将叶子节点改为单位线段而非点 } void putdown_add(int r){ tree[tree[r].left].lazy=tree[tree[r].right].lazy=2; tree[r].lazy=0; } void putdown_delete(int r){ tree[tree[r].left].lazy=tree[tree[r].right].lazy=1; tree[r].lazy=0; }//两种下放操作 void _add(int r){ if(tree[r].lazy==2)return;///若k号点已被涂色,结束操作 if(tree[r].a>=a&&tree[r].b<=b){tree[r].lazy=2;return;}//若k号点被完全覆盖,将k号点标记为已涂色 if(tree[r].left&&tree[r].right){////讨论区间[x,y]与k号点部分相交的情况,若k号点存在左右儿子,则讨论之 if(tree[r].lazy==1)putdown_delete(r); int mid=(tree[r].a+tree[r].b)>>1; if(!(b<tree[tree[r].left].a||a>tree[tree[r].left].b))_add(tree[r].left); if(!(b<tree[tree[r].right].a||a>tree[tree[r].right].b))_add(tree[r].right); } } void _delete(int r){ if(tree[r].lazy==1)return; if(tree[r].a>=a&&tree[r].b<=b){tree[r].lazy=1;return;} if(tree[r].left&&tree[r].right){ if(tree[r].lazy==2)putdown_add(r); int mid=(tree[r].a+tree[r].b)>>1; if(!(b<tree[tree[r].left].a||a>tree[tree[r].left].b))_delete(tree[r].left); if(!(b<tree[tree[r].right].a||a>tree[tree[r].right].b))_delete(tree[r].right); } } int getans(int r){ if(tree[r].lazy==1)return 0; if(tree[r].lazy==2)return (tree[r].b-tree[r].a); int t1=0,t2=0; if(tree[r].left)t1=getans(tree[r].left); if(tree[r].right)t2=getans(tree[r].right); return (t1+t2); } int main(){ _read(n); buildtree(1,200000); for(int i=1;i<=n;i++){ _read(k);_read(a);_read(b); if(k==1)_add(1); else _delete(1); } cout<<getans(1); }
相关文章推荐
- 【Tween Animation 变化动画】
- jenkins 安装,配置 和 运行 & Build Pipeline 插件的使用
- The CPU has been disabled by the guest operating system. You will need to power off or reset the vir
- 我的python学习--第二天(list)
- spring中@param和mybatis中@param使用区别
- 去除ArrayList集合中的重复元素
- scss 命令行参数 no-cache
- ACM:平衡树(1)——Treap
- 使用命令生成puppet.conf无法启动puppet master问题解决
- maven异常
- Ubuntu 14.04 Trusty安装java环境
- Linus的redHat在root出现错误:-bash: addgroup: command not found
- Spring管理 hibernate 事务配置的五种方式
- 关于VSAN 6.x版本里一个针对SSD性能不足时的写入保护导致强行Unmount VSAN磁盘问题
- 获取本机的全部环境属性
- php.ini参数调优
- 百度逆地址解析
- Processing Bitmaps Off the UI Thread
- C++中重载、重写(覆盖)和隐藏的区别实例分析
- JS函数的定义与调用方法