求一组hack
查看原帖
求一组hack
974277
水星湖psgqwq楼主2024/3/18 23:20
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,fa[400005],sum,k,sz[400005];
stack<int> s, ans;
vector<int> p[200005]; 
unordered_map<int,int> mp;
int find(int x){
    return fa[x] == x ? x : find(fa[x]);
}
void merge(int x,int y){
    if(sz[x] < sz[y]) swap(x, y);
    fa[find(y)] = find(x);
    sz[x] += sz[y];
}
signed main()
{
    cin>>n>>m;
    sum = n;
    for(int i=0;i<n;i++)  
        fa[i]=i,sz[i] = 1; 
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        p[x].push_back(y);
        p[y].push_back(x);
    }
    cin>>k;
    for(int i=1;i<=k;i++)
    {
        int x;
        cin>>x;
        s.push(x);
        mp[x] = 1;
    }
    for(int i=0;i<n;i++)
    {
        if(mp[i])continue;
        int ri = find(i);
        for(int j : p[i])
        {
            int rj = find(j);
            if(!mp[j] && rj != ri)
            {
                sum -= (sz[rj] == 1) + (sz[ri] == 1);
                merge(i,j);
            }
        }
    }
    sum -= k;
    while(s.size())
    {
        ans.push(sum);
        int i = s.top();
        s.pop();
        mp[i] = 0;
        int f = 0;
        for(int j : p[i])
            if(!mp[j] && find(j) != find(i))
                merge(i,j), sum--, f = 1;
        if(f) sum++;
    }
    ans.push(sum);
    while(ans.size())cout << ans.top() << endl, ans.pop();
    return 0;
}

有RE,WA,TLE都有。。。

2024/3/18 23:20
加载中...