U+ 特殊性质求调
查看原帖
U+ 特殊性质求调
762775
Crsuh2er0楼主2024/11/23 22:46

rt,想法是 U 所在的连通块所有节点都是 U

第三个大样例

输出

0
0
101
14
270
893

答案

0
0
206
15
275
891

代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
int n,m,fa[MAXN];
bitset<MAXN> isu,vis;
basic_string<int> p[MAXN];

void init() {
    cin >> n >> m;
    isu.reset();
    vis.reset();
    memset(fa,0,sizeof fa);
    for(int i = 1;i <= n;i++) p[i].clear();
    for(int i,j;m;m--){
        char v;
        cin >> v >> i;
        if(v == 'U'){
            fa[i] = i,isu[i] = 1;
        } else {
            cin >> j;
            fa[i] = j,isu[i] = 0;
        }
    }
    for(int u = 1;u <= n;u++) p[u] += fa[u],p[fa[u]] += u;
}

int dfs(int u){
    if(vis[u]) return 0;
    int res = vis[u] = 1;
    for(int v : p[u]) res += dfs(v);
    return res;
}

void solve(){
    init();
    int ans = 0;
    for(int u = 1;u <= n;u++){
        if(vis[u] || !isu[u]) continue;
        ans += dfs(u);
    }
    cout << ans << '\n';
}

int main() { 
    int c,t;
    cin >> c >> t;
    while(t--) solve();
}
2024/11/23 22:46
加载中...