您的位置:首页 > 其它

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

2017-07-15 20:50 295 查看
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],操作一次;

由于5,6,7已经被合并到了4这个点,所以下一次直接跳到4;

fa[4]=3,操作一次;

fa[3]=2,直接调到2;

fa[2]=1,操作一次。

【Accepted】

1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<string>
5 #include<cmath>
6 #include<algorithm>
7 #include<set>
8 #include<queue>
9 using namespace std;
10 const int maxn=2e5+3;
11 int fa[maxn];
12 int n,m;
13 int find(int x)
14 {
15     return fa[x]==x?x:fa[x]=find(fa[x]);
16 }
17 void init()
18 {
19     for(int i=0;i<=n;i++)
20     {
21         fa[i]=i;
22     }
23 }
24 int main()
25 {
26     while(~scanf("%d%d",&n,&m))
27     {
28         init();
29         for(int i=0;i<m;i++)
30         {
31             int x,y;
32             scanf("%d%d",&x,&y);
33             while(find(y)!=find(x-1))
34             {
35                 fa[find(y)]=fa[find(y)-1];
36                 n--;
37             }
38             cout<<n<<endl;
39         }
40     }
41     return 0;
42 }


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: