列表

详情


NC235622. 叠积木

描述

牛可乐得到了编号从 1n 块不同的积木,初始时每块积木单独为一列,牛可乐会对这些积木进行 q 次操作。操作分为两种:
- 牛可乐选择两个整数 x,y,将编号为 x 的积木所在的列放到编号为 y 的积木所在列的正上方。
- 牛可乐选择一个整数 x,并询问你编号为 x 的积木下方有多少块积木。

请你对每次询问操作输出正确答案。

输入描述

第一行包含一个整数 ,代表牛可乐的操作次数。

之后 q 行,每行代表一次操作,两种操作会以下形式给出:

- M x y ,代表移动操作,数据保证编号为 x,y 的两块积木不会位于同一列。。

- C ,代表询问操作。

注意本题不会给出 n 的值。

输出描述

对于每个询问操作,输出一个整数,代表编号为 x 的积木下方有多少块积木。

示例1

输入:

6
M 1 3
M 2 4
C 3
C 2
M 4 5
C 2

输出:

0
1
2

说明:

对于第一次询问,编号 3 的积木下方没有积木,答案为 0。
对于第一次询问,编号 2 的积木下方有积木 4,答案为 1。
对于第一次询问,编号 2 的积木下方有积木 4、5,答案为 2。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 865ms, 内存消耗: 41776K, 提交时间: 2023-07-05 22:51:08

p = list(range(30001))  # 将每个值与自己对应
cnt = [1 for _ in range(30001)]
val = [0 for _ in range(30001)]


def dfs(x):  # 并查集
    if p[x] != x:
        temp = p[x]
        p[x] = dfs(p[x])
        val[x] += val[temp]
    return p[x]


for _ in range(int(input())):
    op = input().split()
    if op[0] == 'M':
        x = int(op[1])
        y = int(op[2])
        y = dfs(y)
        x = dfs(x)
        p[x] = y
        val[x] = cnt[y]
        cnt[y] += cnt[x]
    else:
        x = int(op[1])
        t = dfs(x)
        print(val[x])

Python3 解法, 执行用时: 1051ms, 内存消耗: 6760K, 提交时间: 2023-05-24 16:51:41

p = list(range(30001))
cnt = [1 for _ in range(30001)]
val = [0 for _ in range(30001)]
def find(x):
    if p[x] != x:
        temp = p[x]
        p[x] = find(p[x])
        val[x] += val[temp]
    return p[x]

q = int(input())
for i in range(q):
    op = input().split()
    if op[0] == 'M':
        x = int(op[1])
        y = int(op[2])
        y = find(y)
        x = find(x)
        p[x] = y
        val[x] = cnt[y]
        cnt[y] += cnt[x]
    else:
        x = int(op[1])
        t = find(x)
        print(val[x])

C++(clang++ 11.0.1) 解法, 执行用时: 225ms, 内存消耗: 1960K, 提交时间: 2022-09-02 12:52:56

#include <bits/stdc++.h>

using namespace std;

int a[30004], b[30004], c[30004];
int find(int x) { return a[x]==x?x:(a[0]=find(a[x]),c[x]+=c[a[x]],a[x]=a[0],a[x]);}
int main() {
    int q, x, y;
    char ch;
    cin >> q;
    for(int i=1;i<=30000;i++) a[i] = i, b[i] = 1;
    while(q--) {
        cin >> ch >> x;
        if(ch=='M') cin >> y, x = find(x), y= find(y), a[x] = y, c[x] = b[y], b[y] += b[x];
        else find(x), cout << c[x] << endl;
    }
}

上一题