40pts玄关求调
查看原帖
40pts玄关求调
1007305
Terry_RE楼主2025/7/19 12:01
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 2e5+7;

int n, m, k;
vector<int> G[N];
bool vis[N];
int query[N];
int fa[N];
int ans[N];
int cnt;

struct Node{
    int u, v;
}e[N];

int find(int x){
    while(x ^ fa[x])
        x = fa[x] = fa[fa[x]];
    return x;
}

void merge(int x, int y){
    x = find(x);
    y = find(y);

    if(x == y)
    	return;
    
    fa[x] = y;
    cnt--;
}

int main(){
    cin.tie(0) -> ios::sync_with_stdio(false);

    cin >> n >> m;
    cnt = 0;

    for(int i = 0; i < n; ++i)
        fa[i] = i;

    for(int i = 1; i <= m; ++i){
        cin >> e[i].u >> e[i].v;
        G[e[i].u].push_back(e[i].v);
        G[e[i].v].push_back(e[i].u);
    }

    cin >> k;

    for(int i = 1; i <= k; ++i){
        cin >> query[i];
        vis[query[i]] = true;
    }

    for(int i = 0; i < n; ++i)
        if(!vis[i])
            cnt++;

    for(int i = 1; i <= m; ++i)
        if(!vis[e[i].u] && !vis[e[i].v])
            merge(e[i].u, e[i].v);

    for(int i = k; i >= 1; --i){
    	ans[i] = cnt;

        int u = query[i];
        vis[u] = false;

        cnt++;

        for(int v : G[u])
            if(!vis[v])
                merge(u, v); 
    }

    cout << cnt << endl;

    for(int i = 1; i <= k; ++i)
        cout << ans[i] << endl;

    return 0;
}
2025/7/19 12:01
加载中...