QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#739400 | #9570. Binary Tree | wifi32767 | TL | 0ms | 0kb | C++20 | 3.7kb | 2024-11-12 21:40:21 | 2024-11-12 21:40:24 |
answer
#include<bits/stdc++.h>
using namespace std;
// #define endl '\n'
using ll = long long;
const int MAX = 3e5 + 5;
void ASSERT(bool x){
if (!x) while (1) cout << "ASSERTION FAILED" << endl;
}
void solve(){
int n; cin >> n;
vector<set<int>> graph(n + 1);
for (int i = 1; i <= n; i ++){
int x, y; cin >> x >> y;
if (x) graph[x].insert(i), graph[i].insert(x);
if (y) graph[y].insert(i), graph[i].insert(y);
}
int t = n, cur = 1;
vector<int> siz(n + 1);
function<void(int, int)> dfs1 = [&](int u, int p){
ASSERT(u >= 1 and u <= n);
siz[u] = 1;
for (int v : graph[u]){
if (v == p) continue;
dfs1(v, u);
siz[u] += siz[v];
}
};
int p = 0;
function<void(int, int)> dfs2 = [&](int u, int pre){
ASSERT(u >= 1 and u <= n);
int maxx = t - siz[u];
for (int v : graph[u]){
if (v == pre) continue;
maxx = max(maxx, siz[v]);
dfs2(v, u);
}
// cerr << u << ' ' << maxx << ' ' << t << ' ' << endl;
if (maxx <= t / 2) p = u;
};
dfs1(1, 0);
while (t > 1){
p = cur;
dfs2(cur, 0);
ASSERT(p >= 1 and p <= n);
// cout << p << ' ' << t << endl;
if (graph[p].size() == 3){
array<int, 3> a;
int it = 0;
for (int j : graph[p]){
ASSERT(j < a.size());
a[it] = j;
it ++;
}
cout << "? " << a[0] << ' ' << a[2] << endl;
int x; cin >> x;
ASSERT(a[0] <= n and a[0] >= 1);
ASSERT(a[1] <= n and a[1] >= 1);
ASSERT(a[2] <= n and a[2] >= 1);
ASSERT(graph[p].count(a[0]));
ASSERT(graph[p].count(a[2]));
ASSERT(graph[a[0]].count(p));
ASSERT(graph[a[2]].count(p));
graph[p].erase(a[0]);
graph[p].erase(a[2]);
graph[a[0]].erase(p);
graph[a[2]].erase(p);
cur = a[x];
}
else if (graph[p].size() == 2){
array<int, 2> a;
int it = 0;
for (int j : graph[p]){
ASSERT(j < a.size());
a[it] = j;
it ++;
}
cout << "? " << a[0] << ' ' << a[1] << endl;
int x; cin >> x;
ASSERT(a[0] <= n and a[0] >= 1);
ASSERT(a[1] <= n and a[1] >= 1);
ASSERT(graph[p].count(a[0]));
ASSERT(graph[p].count(a[1]));
ASSERT(graph[a[0]].count(p));
ASSERT(graph[a[1]].count(p));
graph[p].erase(a[0]);
graph[p].erase(a[1]);
graph[a[0]].erase(p);
graph[a[1]].erase(p);
if (x == 0) cur = a[0];
else if (x == 2) cur = a[1];
else{
cout << "! " << p << endl;
return;
}
}
else if (graph[p].size() == 1){
int i;
for (int j : graph[p]) i = j;
cout << "? " << i << ' ' << p << endl;
int x; cin >> x;
if (x == 0) cout << "! " << i << endl;
else if (x == 2) cout << "! " << p << endl;
return;
}
else{
cout << "! " << p << endl;
return;
}
ASSERT(cur >= 1 and cur <= n);
dfs1(cur, 0);
t = siz[cur];
}
cout << "! " << cur << endl;
}
signed main(){
// ios::sync_with_stdio(0);cin.tie(0);
// cout << fixed << setprecision(10);
int T;cin>>T;while (T--)
solve();
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Time Limit Exceeded
input:
2 5 0 0 1 5 2 4 0 0 0 0
output:
ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION FAILED ASSERTION F...