POJ1988 Cube Stacking 题解
2018-02-26 10:28
197 查看
POJ1988 Cube Stacking 题解
原题链接:http://poj.org/problem?id=1988题目大意
有N个方块,P个操作。一种操作是M x y表示把含x的方块堆移动到含y的方块堆顶部,另一种操作C x询问在含x方块的方块堆中,在x方块下面的方块数,然后输出。解题思路
并查集的路径迭代。定义Up[i]Up[i]为i方块上的方块数(含自己),Down[i]Down[i]为i方块下的方块数(不含自己),显然初始化Up[i]=1,Down[i]=0Up[i]=1,Down[i]=0
对于每次M操作,我们可以发现含x的方块堆下多了含y的方块堆的方块数,即Down[x]+=Up[y]Down[x]+=Up[y],含y的方块堆上多了含x的方块堆的方块数,即Up[y]+=Down[x]Up[y]+=Down[x],但是两个方块堆中其他方块没有被修正,这里就要把getfa(x)getfa(x)这个函数做修改,每次getfa(x)getfa(x)的时候Down[x]+=Down[fa[x]]Down[x]+=Down[fa[x]]即可。
对于C操作,输出Down[x]Down[x]就行了。
代码
#include<cstdio> #include<algorithm> using namespace std; int N,Up[30005],Down[30005],fa[30005]; inline int getfa(int x){ if (x==fa[x]) return x; int f=fa[x]; fa[x]=getfa(fa[x]); //这里先修正Down[fa[x]] Down[x]+=Down[f]; //修正Down[x] return fa[x]; } inline void merge(int x,int y){ x=getfa(x);y=getfa(y); if (x==y) return ; Down[x]=Up[y];Up[y]+=Up[x];fa[x]=y; } inline char read(){ char ch=getchar(); while (ch!='M'&&ch!='C') ch=getchar(); return ch; } int main() { scanf("%d",&N); for (int i=1;i<=30000;i++) fa[i]=i,Up[i]=1,Down[i]=0; //初始化 for (int i=1;i<=N;i++){ char ch=read(); if (ch=='M'){ int x,y; scanf("%d%d",&x,&y); merge(x,y); //合并 } else { int x;scanf("%d",&x); getfa(x); //计算前先修正 printf("%d\n",Down[x]); } } return 0; }
相关文章推荐
- poj-1988-Cube Stacking
- POJ 1988 Cube Stacking(带权并查集)
- POJ 1988 Cube Stacking
- poj 1988 - Cube Stacking(并查集)
- POJ1988 Cube Stacking
- 带权并查集--POJ 1988-Cube Stacking
- 【POJ1988】Cube Stacking(并查集)
- POJ 1988 Cube Stacking(并查集+路径压缩)
- POJ 1988 Cube Stacking
- POJ 1988 Cube Stacking 带权并查集
- POJ--1988 cube stacking
- POJ 1988 Cube Stacking (并查集,节点到根节点的距离题目)
- poj 1988 cube Stacking
- poj 1988 Cube Stacking(并查集)
- POJ 1988 Cube Stacking (带权并查集)
- poj 1988 Cube Stacking
- 并查集-poj-1988-Cube Stacking
- poj 1988 Cube Stacking(加权并查集 )
- poj-1988 Cube Stacking 带权并查集
- POJ 1988 Cube Stacking