codevs 1191 数轴染色

1191 数轴染色

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 黄金 Gold

题解

题目描述 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

看了别人的的题解,发现能用并查集!好神呐,以下为原话

每次我们摧毁了一个区间,下一次如果还要摧毁这个区间或者它的子区间的话,我们就不用处理了。这样我们可以把每一个区间抽象成一个点,用并查集来维护。合并时将[L,R]区间全部合并,然后n–。这样每个点只会被合并一次

#include<cstdio>

int father[200010];

int find(int x)
{
    if(father[x]!=x)father[x]=find(father[x]);
    return father[x];
}

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<=n;i++) father[i]=i;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        while(find(y)!=find(x-1)) {
            father[find(y)]=father[find(y)-1];
            n--;
        }
        printf("%d\n",n);
    }
    return 0;
}
时间: 2024-10-29 19:12:03

codevs 1191 数轴染色的相关文章

codevs 1191 数轴染色 区间更新加延迟标记

题目描述 Description 在一条数轴上有N个点,分别是1-N.一开始所有的点都被染成黑色.接着我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色.请输出每个操作执行后剩余黑色点的个数. 输入描述 Input Description 输入一行为N和M.下面M行每行两个数Li.Ri 输出描述 Output Description 输出M行,为每次操作后剩余黑色点的个数. 样例输入 Sample Input 10 33 35 72 8 样例输出 Sample Output 963 数据

1191 数轴染色

1191 数轴染色 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一条数轴上有N个点,分别是1-N.一开始所有的点都被染成黑色.接着我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色.请输出每个操作执行后剩余黑色点的个数. 输入描述 Input Description 输入一行为N和M.下面M行每行两个数Li.Ri 输出描述 Output Description 输出M行,为每次操作后剩余黑色点的个数. 样例输入 S

codevs 1191 树轴染色 线段树区间定值,求和

codevs 1191 树轴染色 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.codevs.cn/problem/1191/ Description 在一条数轴上有N个点,分别是1-N.一开始所有的点都被染成黑色.接着我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色.请输出每个操作执行后剩余黑色点的个数. Input 输入一行为N和M.下面M行每行两个数Li.Ri Output 输出M行,为每次操作后剩余黑色点的个数.

【codevs1191】数轴染色 线段树 区间修改+固定区间查询

[codevs1191]数轴染色 2014年2月15日4317 题目描述 Description 在一条数轴上有N个点,分别是1-N.一开始所有的点都被染成黑色.接着我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色.请输出每个操作执行后剩余黑色点的个数. 输入描述 Input Description 输入一行为N和M.下面M行每行两个数Li.Ri 输出描述 Output Description 输出M行,为每次操作后剩余黑色点的个数. 样例输入 Sample Input 10 33 3

CodeVS 数轴染色

#include<cstdio> #include<algorithm> using namespace std; #define lson rt<<1 #define rson rt<<1|1 const int maxn=200010; int xd[maxn*4],tag[maxn*4],all,n; void pushdown(int l,int r,int rt) { if(tag[rt]==1) { xd[lson]=xd[rson]=1; ta

【数轴染色+并查集路径压缩+加速】

http://codevs.cn/problem/1191/ [思路] 每次我们染了一个区间,下一次如果还要染这个区间或者它的子区间的话,我们就不用处理了.这样我们可以把每一个区间抽象成一个点,用并查集来维护.合并时将[L,R]区间全部合并,[L,R]区间的每个点的父节点都通过路径合并变成L-1,然后n–.这样每个点只会被合并一次,复杂度O(nα(n)) ,跑得很快. 如 3 3 fa[3]=2,操作一次 5 7, fa[7]=fa[6]=fa[5]=4,操作三次 2 8: fa[8]=fa[7

[CODEVS 1050] 棋盘染色 2

描述 有一个5*N的棋盘,棋盘中的一些格子已经被染成了黑色,你的任务是对最少的格子染色,使得所有的黑色能连成一块. http://codevs.cn/problem/1050/ 分析 CODEVS 题解里有个很良心的人, 我是看了他的才写的. http://codevs.cn/wiki/solution/?problem_id=1050 Solution_ID:5329 轮廓线DP. 我开始错在了把 normalize(b) 放在了if前面, 导致if判断打了酱油- 采用四进制 (两个二进制位)

[Codevs] 1014 棋盘染色

1049 棋盘染色 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一个5×5的棋盘,上面有一些格子被染成了黑色,其他的格子都是白色,你的任务的对棋盘一些格子进行染色,使得所有的黑色格子能连成一块,并且你染色的格子数目要最少.读入一个初始棋盘的状态,输出最少需要对多少个格子进行染色,才能使得所有的黑色格子都连成一块.(注:连接是指上下左右四个方向,如果两个黑色格子只共有一个点,那么不算连接) 输入描述 Input Descri

codevs——1049 棋盘染色

1049 棋盘染色 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 有一个5×5的棋盘,上面有一些格子被染成了黑色,其他的格子都是白色,你的任务的对棋盘一些格子进行染色,使得所有的黑色格子能连成一块,并且你染色的格子数目要最少.读入一个初始棋盘的状态,输出最少需要对多少个格子进行染色,才能使得所有的黑色格子都连成一块.(注:连接是指上下左右四个方向,如果两个黑色格子只共有一个点,那么不算连接) 输入描述 In