数轴染色
2016-02-20 08:55
302 查看
题目描述 Description
在一条数轴上有N个点,分别是1~N。一开始所有的点都被染成黑色。接着
我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色。请输出每个操作执行后
剩余黑色点的个数。
输入描述 Input Description
输入一行为N和M。下面M行每行两个数Li、Ri
输出描述 Output Description
输出M行,为每次操作后剩余黑色点的个数。
样例输入 Sample Input
10 3
3 3
5 7
2 8
样例输出 Sample Output
9
6
3
数据范围及提示 Data Size & Hint
数据限制
对30%的数据有1<=N<=2000,1<=M<=2000
对100%数据有1<=Li<=Ri<=N<=200000,1<=M<=200000
这道题最容易想到的就是线段树,但是此题用并查集复杂度更低,将右边界
作为根节点,这样就可以避免重复计算一个点,对于计算了的肯定合并到右边界
上,所以直接跳就行。
在一条数轴上有N个点,分别是1~N。一开始所有的点都被染成黑色。接着
我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色。请输出每个操作执行后
剩余黑色点的个数。
输入描述 Input Description
输入一行为N和M。下面M行每行两个数Li、Ri
输出描述 Output Description
输出M行,为每次操作后剩余黑色点的个数。
样例输入 Sample Input
10 3
3 3
5 7
2 8
样例输出 Sample Output
9
6
3
数据范围及提示 Data Size & Hint
数据限制
对30%的数据有1<=N<=2000,1<=M<=2000
对100%数据有1<=Li<=Ri<=N<=200000,1<=M<=200000
这道题最容易想到的就是线段树,但是此题用并查集复杂度更低,将右边界
作为根节点,这样就可以避免重复计算一个点,对于计算了的肯定合并到右边界
上,所以直接跳就行。
#include <stdio.h> const int maxn = 200005; int father[maxn]; bool col[maxn]; void init ( int n ) { for ( int i = 1; i <= n; i ++ ) father[i] = i, col[i] = false; } int find ( int x ) { return x == father[x] ? x : father[x] = find ( father[x] ); } void Merge ( int x, int y ) { int fx = find ( x ), fy = find ( y ); if ( fx != fy ) father[fx] = fy; } int main ( ) { int n, m, ans, L, R; scanf ( "%d%d", &n, &m ); ans = n; init ( n ); while ( m -- ) { scanf ( "%d%d", &L, &R ); int i = L; while ( i <= R ) //将最远的右边界作为根节点 { if ( col[i] == false ) { col[i] = true; ans --; } int t = find ( i ); Merge ( i, R ); i = t+1; //直接可以跳到右边界+1位置,因为前面已经计算 } printf ( "%d\n", ans ); } return 0; }
相关文章推荐
- LeetCode Convert Sorted List to Binary Search Tree
- 北京Uber优步司机奖励政策(2月20日~2月21日)
- Elasticsearch 2.2.0 分词篇:中文分词
- 【原创】开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
- 【原创】C#玩高频数字彩快3的一点体会
- 【原创】.NET读写Excel工具Spire.Xls使用(2)Excel文件的控制
- 【踩坑经历】一次Asp.NET小网站部署踩坑和解决经历
- Java程序员最喜欢的11款免费IDE编辑器
- 人工智能和机器学习领域的一些有趣的开源项目
- 【原创】.NET读写Excel工具Spire.Xls使用(1)入门介绍
- 【分享】Matlab R2015a 发布啦!
- 【分享】博客美化(8)让你的博客“推荐按钮”动起来
- 【原创】开源Math.NET基础数学类库使用(14)C#生成安全的随机数
- 关于推荐系统中的特征工程
- 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
- 【原创】开源Math.NET基础数学类库使用(12)C#随机数扩展方法
- 【原创】开源Math.NET基础数学类库使用(11)C#计算相关系数
- 【反传销】传销故事总结—如何尽可能保护自身和家人安全
- 【原创】开源Math.NET基础数学类库使用(10)C#进行基本数据统计
- 【原创】开源Math.NET基础数学类库使用(09)相关数论函数使用