40pts求助
查看原帖
40pts求助
1183187
sxhy楼主2024/9/6 22:06
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 7;
const int M = 3e4 + 7;
const long long mod = 1e9 + 7;
#define up(i,l,r) for(int i=l;i<=r;i++)
#define dn(i,l,r) for(int i=l;i>=r;i--)
#define mms(k,p) memset(k,p,sizeof(k))
#define pr(c) printf("%lld\n",c)
ll n, m, ans[N], res;
ll f[N], sp[N], remb[N];
ll k;
struct node {
	ll v;
};
vector<node>g[N];
void add(ll x, ll y) {
	g[x].push_back({ y });
}
int find(ll x) {
	if (x == f[x])return x;
	return f[x] = find(f[x]);
}
void  mer(ll x, ll y) {
	ll a = find(x), b = find(y);
	f[a] = b;
}
int main() {
	cin >> n >> m;
	up(i, 1, m) {
		ll a, b;
		scanf("%lld%lld", &a, &b);
		add(a, b), add(b, a);
	}
	up(i, 1, n) {
		f[i] = i;
	}
	cin >> k;
	up(i, 1, k) {
		ll x;
		scanf("%lld", &remb[i]);
		sp[remb[i]] = 1;
	}
	res = n - k;
	up(i, 0, n-1) {
		for (auto nv : g[i])
			if (!sp[i] && !sp[nv.v] && f[i] != f[nv.v]) {
				res--;
				mer(i, nv.v);
			}
	}
	ans[k ] = res;
	dn(i, k-1, 0) {
		ll x = remb[i+1];
		res++;
		sp[x] = 0;
		for (auto nv : g[x])
		{
			ll v1 = nv.v;
			ll a = find(x), b = find(v1);
			if (!sp[v1] && a != b)
			{
				res--;
				mer(x, v1);
			}
		}
		ans[i] = res;
	}
	up(i, 0, k ) {
		pr(ans[i]);
	}

}
2024/9/6 22:06
加载中...