【并查集】Codeforces 566D Restructuring Company
2017-10-22 17:10
453 查看
题面在这里
对于本题,只需要再维护一个并查集表示i所在联通块的最右位置
因为相邻两个元素之间的关系至多被处理1次
所以均摊是O(q⋅α(n))
示例程序:
对于本题,只需要再维护一个并查集表示i所在联通块的最右位置
因为相邻两个元素之间的关系至多被处理1次
所以均摊是O(q⋅α(n))
示例程序:
#include<cstdio> #define pc putchar inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline int red(){ int res=0,f=1;char ch=nc(); while (ch<'0'||'9'<ch) {if (ch=='-') f=-f;ch=nc();} while ('0'<=ch&&ch<='9') res=res*10+ch-48,ch=nc(); return res*f; } const int maxn=200005; int n,q,fa[maxn],nxt[maxn]; int getfa(int x){ return fa[x]==x?x:fa[x]=getfa(fa[x]); } int getnxt(int x){ return nxt[x]==x?x:nxt[x]=getnxt(nxt[x]); } int main(){ n=red(),q=red(); for (int i=1;i<=n;i++) fa[i]=nxt[i]=i; while (q--){ int c=red(),x=red(),y=red(); if (c==1) fa[getfa(x)]=getfa(y); else if (c==2){ for (int j=getnxt(x);j<y;j=getnxt(j+1)) fa[getfa(j)]=getfa(y),nxt[getnxt(j)]=getnxt(j+1); }else if (getfa(x)==getfa(y)) pc('Y'),pc('E'),pc('S'),pc('\n');else pc('N'),pc('O'),pc('\n'); } return 0; }
相关文章推荐
- CodeForces 445B. DZY Loves Chemistry(并查集)
- Codeforces 745C - Hongcow Builds A Nation 并查集乱搞,注意路径压缩
- Codeforces 731C 并查集
- (并查集)Codeforces 325 D-Reclamation
- CodeForces 731C Socks (DFS或并查集)
- Codeforces 870E Points, Lines and Ready-made Titles 并查集
- [Codeforces 1027 F] Session in BSU [并查集维护二分图匹配问题]
- 【Codeforces811E】Vladik and Entertaining Flags [线段树][并查集]
- CodeForces 722C. Destroying Array(并查集 好题)
- CodeForces - 371D. Vessels(并查集)
- CodeForces - 731C Socks(并查集)(贪心)
- CodeForces - 698B Fix a Tree(并查集)
- CodeForces 616C The Labyrinth (二维并查集)
- Codeforces 400 D.Dima and Bacteria(并查集+弗洛伊德)
- 【并查集】【模拟】Codeforces 698B & 699D Fix a Tree
- CodeForces - 505B 图的连同性,多维并查集或用搜索写
- CodeForces 300B Coach(并查集)
- Codeforces-939D:Love Rescue(并查集)
- CodeForces - 791B 并查集或dfs
- Codeforces 452E Three strings 后缀数组 + 并查集