結果
| 問題 |
No.1153 ねこちゃんゲーム
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-04-17 18:42:05 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,809 bytes |
| コンパイル時間 | 2,239 ms |
| コンパイル使用メモリ | 205,592 KB |
| 最終ジャッジ日時 | 2025-02-12 09:35:29 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 RE * 1 |
| other | RE * 40 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using Vi = std::vector<int>;
using VVi = vector<Vi>;
int main () {
int N, M;
cin >> N >> M;
Vi A(M);
for (auto& a : A) {
cin >> a;
}
VVi gr(N);
for (int s = 1; s < N; s ++) {
int a, b;
cin >> a >> b;
gr[--a].push_back(--b);
gr[b].push_back(a);
}
Vi tpr;
queue<int> que;
Vi par(N, -1);
tpr.push_back(0);
que.push(0);
while (!que.empty()) {
int u = que.front();
que.pop();
for (auto v : gr[u]) {
if (v == par[u]) {
continue;
}
par[v] = u;
tpr.push_back(v);
que.push(v);
}
}
Vi dp(N);
VVi dps(N);
VVi sns(N);
Vi CC(N + 10, 0);
for (auto u : tpr) {
for (auto v : gr[u]) {
if (v == par[u]) {
continue;
}
sns[u].push_back(dp[v]);
CC[dp[v]] ++;
}
dp[u] = 0;
while (CC[dp[u]]) {
dp[u] ++;
}
for (auto v : gr[u]) {
if (v == par[u]) {
dps[u].push_back(-1);
} else {
if (dp[v] <= dp[u] && CC[dp[v]] == 1) {
dps[u].push_back(dp[v]);
} else {
dps[u].push_back(dp[u]);
}
}
}
for (auto a : sns[u]) {
CC[a] --;
}
}
Vi dp2(N);
dp2[0] = dp[0];
Vi Pid(N, 0);
for (int i = 1; i < N; i ++) {
while (gr[i][Pid[i]] != par[i]) Pid[i] ++;
}
for (auto u : tpr) {
for (auto a : sns[u]) {
CC[a] ++;
}
if (u) {
dp2[u] = 0;
while (CC[dp2[u]]) dp2[u] ++;
}
for (int i = 0; i < gr[u].size(); i ++) {
int v = gr[u][i];
if (v != par[u]) {
if (dp[v] <= dp2[u] && CC[dp[v]] == 1) {
sns[v][Pid[v]] = dp[v];
} else {
sns[v][Pid[v]] = dp2[u];
}
}
}
for (auto a : sns[u]) {
CC[a] --;
}
}
int xx = 0;
for (auto a : A) {
xx ^= dp2[a];
}
if (!xx) {
puts("-1 -1");
} else {
for (int i = 0; i < M; i ++) {
int a = A[i];
if (dp2[a] ^ xx > dp2[a]) {
continue;
}
int b = 0;
for (int j = 0; j < gr[a].size(); j ++) {
int x = sns[a][j];
if (dp2[a] ^ x == xx) {
b = gr[a][j];
break;
}
}
printf("%d %d\n", a + 1, b + 1);
break;
}
}
}