【数轴染色+并查集路径压缩+加速】数轴染色
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】
View Code
【思路】
每次我们染了一个区间,下一次如果还要染这个区间或者它的子区间的话,我们就不用处理了。这样我们可以把每一个区间抽象成一个点,用并查集来维护。合并时将[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
相关文章推荐
- 【数轴涂色+并查集路径压缩+加速】C. String Reconstruction
- [并查集+路径压缩]zoj 3261:Connections in Galaxy War
- 并查集 路径压缩 非递归写法
- HDU 3635 Dragon Balls(并查集路径压缩)
- 并查集压缩路径
- 并查集 路径压缩
- 【Codeforces Round 329 (Div 2) D】【LCA+并查集路径压缩】Happy Tree Party 除上两点间路径全部权值
- 并查集——路径压缩
- POJ 1988 Cube Stacking(路径压缩并查集)
- 十、森林与并查集---(6)并查集路径压缩优化
- HDU - 2545 树上战争(没有路径压缩的并查集)
- Codeforces 745C - Hongcow Builds A Nation 并查集乱搞,注意路径压缩
- poj1182食物链(带权并查集+路径压缩)
- 并查集(按秩合并、路径压缩)
- hdu 1856 并查集(路径压缩)
- poj1988 并查集+路径压缩
- 数据结构实现之并查集(使用按秩合并和路径压缩)
- 并查集 路径压缩
- 数据结构与算法分析(Java语言描述)(24)—— 并查集的路径压缩
- 并查集路径压缩方法