P1197
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 4e5 + 5;
const int MAXM = 4e5 + 5;
int n, m, k, head[MAXM], to[MAXM], nxt[MAXM], tot, ans[MAXN], f[MAXN], a[MAXN], cnt;
bool uninit[MAXN];
inline void link(int u, int v)
{
to[tot] = v;
nxt[tot] = head[u];
head[u] = tot++;
}
int Find(int x)
{
return x == f[x] ? x : f[x] = Find(f[x]);
}
inline void Union(int u, int v)
{
int x = Find(u), y = Find(v);
if (x != y)
{
f[y] = x;
cnt--;
}
}
inline void Add(int x)
{
for (int i = head[x]; ~i; i = nxt[i])
if (!uninit[to[i]])
Union(x, to[i]);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
int u, v;
memset(head, -1, sizeof(head));
for (int i = 1; i <= n; i++)
f[i] = i;
for (int i = 1; i <= m; i++)
{
cin >> u >> v;
link(u, v);
link(v, u);
}
cin >> k;
for (int i = 1; i <= k; i++)
{
cin >> a[i];
uninit[a[i]] = true;
}
cnt = n - k;
for (int i = 1; i <= n; i++)
if (!uninit[i])
Add(i);
ans[k + 1] = cnt;
for (int i = k; i; i--)
{
cnt++;
uninit[a[i]] = false;
Add(a[i]);
ans[i] = cnt;
}
for (int i = 1; i <= k + 1; i++)
cout << ans[i] << '\n';
return 0;
}
题目范围是2e5,如果手残把MAXN改成1e5+5会TLE 3个点。是我了
然后一开始脑残把link写成了这样子:
inline void link(int u, int v)
{
to[++tot] = v;
nxt[tot] = head[u];
head[u] = tot++;
}
于是TLE了8个点,不应该RE吗