bzoj3376 [Usaco2004 Open]Cube Stacking 方块游戏
2017-11-24 11:59
435 查看
Description
约翰和贝茜在玩一个方块游戏.编号为 1 到 n 的 <4000
span style="position: absolute; clip: rect(1.816em 1000em 3.149em -0.477em); top: -2.717em; left: 0.003em;">n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱.
游戏开始后,约翰会给贝茜发出P(1≤P≤100000)个指令.指令有两种:
移动(M): 将包含 X 的立方柱移动到包含 Y 的立方柱上.
统计(C): 统计名含 X 的立方柱中,在 X 下方的方块数目
写个程序帮贝茜完成游戏.
Input
第 1 行输入 P,之后 P 行每行输入一条指令.形式为”M X Y”或者”C X”输入保证不会有将立方柱放在自己头上的指令.
Output
每一行,对于每个统计指令,输出其结果.Sample Input
6M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
Sample Output
10
2
Solution
带权并查集。记录三个信息,fa[x],dn[x],dis[x],分别表示 x 所在的柱的最上面的方块、最下面的方块、x 到最上面方块的距离。#include<bits/stdc++.h> using namespace std; #define N 100001 inline int read() { int x = 0, flag = 1; char ch = getchar(); while (!isdigit(ch)) { if (!(ch ^ '-')) flag = -1; ch = getchar(); } while (isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar(); return x * flag; } inline void write(int x) { if (!x) { putchar('0'); return; } if (x < 0) putchar('-'), x = -x; char buf[30] = ""; int top = 0; while (x) buf[++top] = x % 10 + '0', x /= 10; while (top) putchar(buf[top--]); } int fa , dn , dis ; int find(int x) { if (fa[x] ^ x) { int y = fa[x]; fa[x] = find(y), dis[x] += dis[y], dn[x] = dn[y]; } return fa[x]; } int main() { int q = read(); rep(i, 1, q) fa[i] = dn[i] = i, dis[i] = 0; while (q--) { char s[5]; scanf("%s", s); if (!(s[0] ^ 'M')) { int x = read(), y = read(), fx = find(x), fy = find(y); fa[fy] = fx, dis[fy] = dis[dn[fx]] + 1, dn[fx] = dn[fy]; find(dn[x]), find(dn[y]); } else { int x = read(); find(x); write(dis[dn[x]] - dis[x]), puts(""); } } return 0; }
相关文章推荐
- POJ 1988/bzoj3376[Usaco2004 Open]Cube Stacking 方块游戏
- bzoj 3376: [Usaco2004 Open]Cube Stacking 方块游戏 带权并查集
- bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏
- BZOJ 3376: [Usaco2004 Open]Cube Stacking 方块游戏
- 【BZOJ 3376】[Usaco2004 Open]Cube Stacking 方块游戏 带权并查集
- 3376: [Usaco2004 Open]Cube Stacking 方块游戏
- 3376: [Usaco2004 Open]Cube Stacking 方块游戏(带权并查集)
- bzoj 3383: [Usaco2004 Open]Cave Cows 4 洞穴里的牛之四(set+BFS)
- bzoj3376&&poj1988 [Usaco2004 Open]Cube Stacking 方块游戏 解题报告
- Bzoj 3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一
- bzoj 3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二(RMQ)
- bzoj 3377: [Usaco2004 Open]The Cow Lineup 奶牛序列
- bzoj 3383: [Usaco2004 Open]Cave Cows 4 洞穴里的牛之四
- [bzoj3378][Usaco2004 Open]MooFest 狂欢节_树状数组
- bzoj3382 [Usaco2004 Open]Cave Cows 3 洞穴里的牛之三
- [BZOJ3378] [Usaco2004 Open]MooFest 狂欢节(树状数组)
- bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏 — 带权并查集
- bzoj 3378: [Usaco2004 Open]MooFest 狂欢节(BIT)
- 【bzoj3379】[Usaco2004 Open]Turning in Homework 交作业
- bzoj 3382: [Usaco2004 Open]Cave Cows 3 洞穴里的牛之三(切比雪夫距离)