結果
問題 | No.1983 [Cherry 4th Tune C] 南の島のマーメイド |
ユーザー |
![]() |
提出日時 | 2022-06-17 21:40:17 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 900 ms / 4,000 ms |
コード長 | 2,187 bytes |
コンパイル時間 | 2,086 ms |
コンパイル使用メモリ | 175,560 KB |
実行使用メモリ | 82,240 KB |
最終ジャッジ日時 | 2024-10-09 07:17:30 |
合計ジャッジ時間 | 23,113 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 41 |
ソースコード
#include <bits/stdc++.h> using namespace std; const int LOG = 18; void dfs(vector<vector<int>> &E, vector<int> &d, vector<int> &p, vector<vector<int>> &c, vector<int> &in, int v){ in.push_back(v); for (int w : E[v]){ if (d[w] == -1){ d[w] = d[v] + 1; p[w] = v; c[v].push_back(w); dfs(E, d, p, c, in, w); } } } int main(){ int N, M, Q; cin >> N >> M >> Q; vector<vector<int>> E(N); for (int i = 0; i < M; i++){ int u, v; cin >> u >> v; u--; v--; E[u].push_back(v); E[v].push_back(u); } vector<int> p(N, -1); vector<vector<int>> c(N); vector<int> d(N, -1); vector<int> imos(N, 0); vector<int> in; for (int i = 0; i < N; i++){ if (d[i] == -1){ d[i] = 0; if (i > 0){ p[i] = 0; c[0].push_back(i); d[i] = 1; imos[i]++; imos[0]--; } dfs(E, d, p, c, in, i); } } for (int i = 0; i < N; i++){ for (int j : E[i]){ if (d[j] < d[i] - 1){ imos[i]++; imos[j]--; } } } reverse(in.begin(), in.end()); for (int v : in){ if (v != 0){ imos[p[v]] += imos[v]; } } vector<vector<int>> pp(LOG, vector<int>(N, -1)); pp[0] = p; vector<vector<int>> sum(LOG, vector<int>(N, 0)); sum[0] = imos; for (int i = 0; i < LOG - 1; i++){ for (int j = 0; j < N; j++){ if (pp[i][j] != -1){ pp[i + 1][j] = pp[i][pp[i][j]]; if (pp[i + 1][j] != -1){ sum[i + 1][j] = sum[i][j] + sum[i][pp[i][j]]; } } } } for (int i = 0; i < Q; i++){ int x, y; cin >> x >> y; x--; y--; if (d[x] > d[y]){ swap(x, y); } int s = 0; for (int j = 0; j < LOG; j++){ if (((d[y] - d[x]) >> j & 1) == 1){ s += sum[j][y]; y = pp[j][y]; } } if (x != y){ for (int j = LOG - 1; j >= 0; j--){ if (pp[j][x] != pp[j][y]){ s += sum[j][x]; s += sum[j][y]; x = pp[j][x]; y = pp[j][y]; } } s += sum[0][x]; s += sum[0][y]; } if (s == 0){ cout << "Yes" << endl; } else { cout << "No" << endl; } } }