結果
問題 |
No.3200 Sinking Islands
|
ユーザー |
|
提出日時 | 2025-08-14 18:52:31 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 500 ms / 2,000 ms |
コード長 | 1,311 bytes |
コンパイル時間 | 893 ms |
コンパイル使用メモリ | 95,080 KB |
実行使用メモリ | 10,240 KB |
最終ジャッジ日時 | 2025-08-14 18:52:44 |
合計ジャッジ時間 | 12,906 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 20 |
ソースコード
#include <iostream> #include <algorithm> #include <utility> #include <numeric> using namespace std; using pii = pair<int, int>; using ll = long long; int fi(int f[], int u) { return f[u] == u ? u : f[u] = fi(f, f[u]); } void un(int f[], int sz[], ll &scsz2, int u, int v) { u = fi(f, u); v = fi(f, v); if (u == v) { return; } f[u] = v; scsz2 -= 1ll * sz[u] * (sz[u] - 1) / 2; scsz2 -= 1ll * sz[v] * (sz[v] - 1) / 2; sz[v] += sz[u]; scsz2 += 1ll * sz[v] * (sz[v] - 1) / 2; } int main() { int n, m; cin >> n >> m; int u[m], v[m]; for (int i = 0; i < m; i++) { cin >> u[i] >> v[i]; u[i]--; v[i]--; } int q; cin >> q; bool rem[m]; fill(rem, rem + m, false); int r[q]; for (int i = 0; i < q; i++) { cin >> r[i]; rem[--r[i]] = true; } int f[n], sz[n]; iota(f, f + n, 0); fill(sz, sz + n, 1); ll scsz2 = 0; for (int i = 0; i < m; i++) { if (!rem[i]) { un(f, sz, scsz2, u[i], v[i]); } } ll ans[q]; for (int i = q - 1; i >= 0; i--) { ans[i] = 1ll * n * (n - 1) / 2 - scsz2; un(f, sz, scsz2, u[r[i]], v[r[i]]); } for (int i = 0; i < q; i++) { cout << ans[i] << endl; } return 0; }