[并查集]51 Nod 1525——重组公司
2017-10-18 19:13
429 查看
题目梗概
普通的并查集问题?多了一种区间合并的操作。
解题思路
还是很水。维护每个点前面最近的没合并的节点是谁就可以了。
#include<cstdio> using namespace std; char nc(){ static char buf[100000],*l=buf,*r=buf; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin); if (l==r) return EOF;return *l++; } inline int _read(){ int num=0;char ch=nc(); while(ch<'0'||ch>'9') ch=nc(); while(ch>='0'&&ch<='9') num=num*10+ch-48,ch=nc(); return num; } const int maxn=200005; int n,m; int f[maxn],lst[maxn]; inline int get(int x){ if (f[x]==x) return x; f[x]=get(f[x]); return f[x]; } inline int get1(int x){ if (lst[x]==x) return x; lst[x]=get1(lst[x]); return lst[x]; } int main(){ freopen("exam.in","r",stdin); freopen("exam.out","w",stdout); n=_read();m=_read(); for (int i=1;i<=n;i++) f[i]=i,lst[i]=i; for (int i=1;i<=m;i++){ int d=_read(),x=_read(),y=_read(); if (d==1) f[get(x)]=get(y); if (d==2) for (int j=get1(y);j>x;j=get1(j)) lst[j]=get1(j-1),f[get(j-1)]=get(j); if (d==3) if (get(x)==get(y)) putchar('Y'),putchar('E'),putchar('S'),putchar('\n');else putchar('N'),putchar('O'),putchar('\n'); } return 0; }
相关文章推荐
- 51NOD 1525 重组公司 并查集
- 51 nod 1456 小K的技术(强连通 + 并查集)
- 51 nod 1427 文明 (并查集 + 树的直径)
- 51 NOD 1521 一维战舰(并查集)
- 51nod 1525 重组公司
- 51 nod 1515 明辨是非(并查集合并)
- 51Nod-1525-重组公司
- 51 nod 1247 可能的路径(exgcd)
- AC日记——3的幂的和 51nod 1013
- 51 Nod 1563——坐标轴上的最大团
- 51 nod 1140
- [思维题]51 Nod 1671——货物运输
- 51 nod 1020 逆序排列(递推+DP)
- 51 Nod 1051 最大子矩阵和 (DP)
- 01背包及完全背包问题(51Nod - 1085,HDU 1114 Piggy-Bank)
- 51 Nod 1130 N的阶乘的长度 V2(斯特林近似)
- 动态规划初步总结(1)(51Nod,CODE[VS]为例题)
- 51 Nod 1028 大数乘法 V2【Java大数乱搞】
- 51nod1005---大数加法(51nod基础:加减模拟)
- 51nod1027---大数乘法(51nod基础:乘法模拟)