QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#115693 | #4926. Where Is the Root? | myrcella | 0 | 1ms | 3460kb | C++14 | 2.1kb | 2023-06-26 16:10:26 | 2023-06-26 16:11:13 |
Judging History
answer
// by szh
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define F first
#define S second
#define pii pair<LL, LL>
#define pb push_back
#define debug(x) cerr << #x << "=" << x << endl
#define pq priority_queue
#define inf 0x3f
#define rep(i,a,b) for (int i=a; i < (b); i++)
#define MP make_pair
#define SZ(x) (static_cast<int>(x.size()))
#define MOD 1000000007
#define ALL(x) x.begin(), x.end()
void inc(int &a, int b) {a = (a+b)%MOD;}
void dec(int &a, int b) {a = (a-b+MOD)%MOD;}
int prod(int a,int b) {return LL(a)*LL(b)%MOD;}
int lowbit(int x) {return x&(-x);}
const int maxn = 555;
int n;
int deg[maxn];
vector <int> edge[maxn];
vector <int> leaf, leaff, candidate;
int main() {
//debug(((10 <= 9) ? 83: max(10, int(83 * (1 - log(10 - 6.0) / 7)))));
// freopen("input.txt","r",stdin);
cin >> n;
rep(i, 1, n) {
int u, v;
cin >> u >> v;
edge[u].pb(v);
edge[v].pb(u);
deg[u]++;
deg[v]++;
}
/*
rep(i, 1, n + 1) {
if (deg[i] == 1) continue;
cout << "? " << n - 1;
rep(j, 1, n + 1) if (i != j) cout << " " << j;
cout << endl;
cout.flush();
string s;
cin >> s;
if (s == "NO") {
cout << "! " << i << endl;
cout.flush();
return 0;
}
}
// root is a leaf
if (SZ(leaf) == 1) {
cout << "! " << leaf[0] << endl;
}
for (auto it : leaf) {
cout << "? " << SZ(leaf) - 1;
for (auto itt : leaf) {
if (it == itt) continue;
cout << " " << itt;
}
cout << endl;
string s;
cin >> s;
if (s == "NO") {
cout << "! " << it << endl;
return 0;
}
}
*/
//idea: check leaves first, then go through non-leaf node
rep(i, 1, n + 1) {
if (deg[i] == 1) leaf.pb(i);
else candidate.pb(i);
}
leaff = leaf;
for (auto it : candidate) leaf.pb(it);
int l = 0, r = SZ(leaf) - 1;
while (l < r) {
int mid = l + r >> 1;
cout << "? " << n - (r - mid);
rep(i, 0, mid + 1) cout << " " << leaf[i];
rep(i, r, n) cout << " " << leaf[i];
cout << endl;
string ss; cin >> ss;
if (ss == "YES") r = mid;
else l = mid + 1;
}
cout << "! " << leaf[l] << endl;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 3432kb
input:
7 4 1 1 2 4 3 3 5 3 6 4 7 NO
output:
? 4 2 5 6 7 4 ? 6 2 5 6 7 1 3 4
result:
wrong output format Unexpected end of file - int32 expected
Subtask #2:
score: 0
Wrong Answer
Test #24:
score: 0
Wrong Answer
time: 0ms
memory: 3448kb
input:
30 1 15 29 30 1 4 7 28 29 17 1 26 26 7 12 5 27 13 3 7 27 1 21 15 9 22 22 5 24 27 19 1 25 30 22 27 6 15 16 13 18 2 27 10 27 30 20 26 8 15 18 8 14 1 27 23 11 3 YES
output:
? 15 2 4 6 9 10 11 12 14 16 17 19 20 21 23 24 30 ? 23 2 4 6 9 10 11 12 14 24 25 28 1 3 5 7 8 13 15 18 22 26 27 29 30
result:
wrong output format Unexpected end of file - int32 expected
Subtask #3:
score: 0
Wrong Answer
Test #54:
score: 0
Wrong Answer
time: 0ms
memory: 3460kb
input:
500 419 133 44 225 391 269 419 461 293 347 108 31 110 363 423 257 321 155 498 87 180 492 251 5 357 30 341 172 275 109 372 446 286 336 208 339 162 320 138 103 129 219 62 141 359 286 130 238 470 460 418 48 210 358 429 13 323 143 382 415 406 394 309 175 325 170 128 108 6 113 363 17 470 457 7 224 288 48...
output:
? 250 2 3 7 8 10 11 12 13 15 16 19 24 26 28 29 33 34 36 37 38 39 40 41 42 43 45 46 47 50 53 54 55 57 58 64 65 67 68 69 70 71 72 73 74 75 76 77 78 79 80 82 83 85 86 88 95 96 99 100 109 110 112 114 117 119 121 122 123 124 126 129 134 135 138 140 144 148 149 150 152 153 154 155 158 164 165 167 168 169 ...
result:
wrong output format Unexpected end of file - int32 expected