結果
問題 |
No.3200 Sinking Islands
|
ユーザー |
![]() |
提出日時 | 2025-07-12 06:31:50 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 91 ms / 2,000 ms |
コード長 | 1,111 bytes |
コンパイル時間 | 3,983 ms |
コンパイル使用メモリ | 282,972 KB |
実行使用メモリ | 7,936 KB |
最終ジャッジ日時 | 2025-07-12 06:32:00 |
合計ジャッジ時間 | 8,577 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 20 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; bool chmin(auto &a, auto b) { return a > b ? a = b, true : false; } bool chmax(auto &a, auto b) { return a < b ? a = b, true : false; } #include <atcoder/dsu> int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; cin >> N >> M; vector<int> U(M), V(M); for (int i = 0; i < M; i++) { cin >> U[i] >> V[i]; U[i]--, V[i]--; } vector<bool> alive(M, true); int Q; cin >> Q; vector<int> B(Q); for (int i = 0; i < Q; i++) { cin >> B[i]; alive[--B[i]] = false; } atcoder::dsu uf(N); ll S = (ll)N * (N - 1) / 2; auto MERGE = [&] (int u, int v) -> void { if (uf.same(u, v)) return; S -= (ll)uf.size(u) * uf.size(v); uf.merge(u, v); }; for (int i = 0; i < M; i++) { if (alive[i]) MERGE(U[i], V[i]); } vector<ll> ans(Q); for (int i = Q - 1; i >= 0; i--) { ans[i] = S; MERGE(U[B[i]], V[B[i]]); } for (int i = 0; i < Q; i++) { cout << ans[i] << '\n'; } }