数轴染色
来源:互联网 发布:网红店经济模式知乎 编辑:程序博客网 时间:2024/04/20 00:22
题目描述 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
这道题最容易想到的就是线段树,但是此题用并查集复杂度更低,将右边界
作为根节点,这样就可以避免重复计算一个点,对于计算了的肯定合并到右边界
上,所以直接跳就行。
#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;}
0 0
- 数轴染色
- 数轴染色
- Wikioi-1191-数轴染色
- wiki-1191数轴染色
- 【wikioi1191】 数轴染色
- wikioi1191 数轴染色
- codevs1191 数轴染色
- Codevs 数轴染色
- 【codevs1191】数轴染色
- 1191 数轴染色
- Codevs 1191 数轴染色
- 【codevs 1191】数轴染色
- [codevs1191]数轴染色
- Codevs 1191 数轴染色
- 1191 数轴染色
- Codevs 1191 数轴染色
- 【codevs 1191】数轴染色
- Codevs1191数轴染色
- 【总结】Newlife XCode组件资源目录汇总【2013年版】
- 【分享】这些年,我使用的一些工具[非开发类]
- 【分享】这些年,我使用的一些工具[非开发类]
- 【原创】.NET开源表达式计算组件介绍与使用
- 【原创】Matlab与.NET基于类型安全的接口混合编程入门
- 数轴染色
- 【原创】Matlab与.NET混合编程解决人脸识别问题
- 我的博客文章汇总
- 【商业源码】生日大放送-Newlife商业源码分享
- 【原创】Aspose.Words组件介绍及使用—基本介绍与DOM概述
- 我被比特币撞了一下腰——记OKCoin试用体验
- 【原创】数据挖掘案例——ReliefF和K-means算法的医学应用
- 【原创】Matlab.NET混合编程技巧之找出Matlab内置函数
- 【吐槽】VS2012的安装项目只能用InstallShield Limited Edition