結果
問題 |
No.3237 Find the Treasure!
|
ユーザー |
![]() |
提出日時 | 2025-08-15 22:25:12 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 8,045 bytes |
コンパイル時間 | 2,160 ms |
コンパイル使用メモリ | 209,900 KB |
実行使用メモリ | 26,356 KB |
平均クエリ数 | 14.13 |
最終ジャッジ日時 | 2025-08-15 22:26:23 |
合計ジャッジ時間 | 10,556 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge6 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 9 WA * 13 |
ソースコード
#line 1 "library/Template/template.hpp" #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i = (int)(a); i < (int)(b); i++) #define rrep(i, a, b) for (int i = (int)(b)-1; i >= (int)(a); i--) #define ALL(v) (v).begin(), (v).end() #define UNIQUE(v) sort(ALL(v)), (v).erase(unique(ALL(v)), (v).end()) #define SZ(v) (int)v.size() #define MIN(v) *min_element(ALL(v)) #define MAX(v) *max_element(ALL(v)) #define LB(v, x) int(lower_bound(ALL(v), (x)) - (v).begin()) #define UB(v, x) int(upper_bound(ALL(v), (x)) - (v).begin()) using uint = unsigned int; using ll = long long int; using ull = unsigned long long; using i128 = __int128_t; using u128 = __uint128_t; const int inf = 0x3fffffff; const ll INF = 0x1fffffffffffffff; template <typename T, typename S = T> S SUM(const vector<T> &a) { return accumulate(ALL(a), S(0)); } template <typename S, typename T = S> S POW(S a, T b) { S ret = 1, base = a; for (;;) { if (b & 1) ret *= base; b >>= 1; if (b == 0) break; base *= base; } return ret; } template <typename T> inline bool chmax(T &a, T b) { if (a < b) { a = b; return 1; } return 0; } template <typename T> inline bool chmin(T &a, T b) { if (a > b) { a = b; return 1; } return 0; } template <typename T, typename U> T ceil(T x, U y) { assert(y != 0); if (y < 0) x = -x, y = -y; return (x > 0 ? (x + y - 1) / y : x / y); } template <typename T, typename U> T floor(T x, U y) { assert(y != 0); if (y < 0) x = -x, y = -y; return (x > 0 ? x / y : (x - y + 1) / y); } template <typename T> int popcnt(T x) { return __builtin_popcountll(x); } template <typename T> int topbit(T x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); } template <typename T> int lowbit(T x) { return (x == 0 ? -1 : __builtin_ctzll(x)); } template <class T, class U> ostream &operator<<(ostream &os, const pair<T, U> &p) { os << "P(" << p.first << ", " << p.second << ")"; return os; } template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) { os << "{"; for (int i = 0; i < vec.size(); i++) { os << vec[i] << (i + 1 == vec.size() ? "" : ", "); } os << "}"; return os; } template <typename T, typename U> ostream &operator<<(ostream &os, const map<T, U> &map_var) { os << "{"; for (auto itr = map_var.begin(); itr != map_var.end(); itr++) { os << "(" << itr->first << ", " << itr->second << ")"; itr++; if (itr != map_var.end()) os << ", "; itr--; } os << "}"; return os; } template <typename T> ostream &operator<<(ostream &os, const set<T> &set_var) { os << "{"; for (auto itr = set_var.begin(); itr != set_var.end(); itr++) { os << *itr; ++itr; if (itr != set_var.end()) os << ", "; itr--; } os << "}"; return os; } #ifdef LOCAL #define debug 1 #define show(...) _show(0, #__VA_ARGS__, __VA_ARGS__) #else #define debug 0 #define show(...) true #endif template <typename T> void _show(int i, T name) { cerr << '\n'; } template <typename T1, typename T2, typename... T3> void _show(int i, const T1 &a, const T2 &b, const T3 &...c) { for (; a[i] != ',' && a[i] != '\0'; i++) cerr << a[i]; cerr << ":" << b << " "; _show(i + 1, a, c...); } #line 2 "sol.cpp" // #include "Utility/fastio.hpp" #line 2 "library/Utility/random.hpp" namespace Random { mt19937_64 randgen(chrono::steady_clock::now().time_since_epoch().count()); using u64 = unsigned long long; u64 get() { return randgen(); } template <typename T> T get(T L) { // [0,L] return get() % (L + 1); } template <typename T> T get(T L, T R) { // [L,R] return get(R - L) + L; } double uniform() { return double(get(1000000000)) / 1000000000; } string str(int n) { string ret; rep(i, 0, n) ret += get('a', 'z'); return ret; } template <typename Iter> void shuffle(Iter first, Iter last) { if (first == last) return; int len = 1; for (auto it = first + 1; it != last; it++) { len++; int j = get(0, len - 1); if (j != len - 1) iter_swap(it, first + j); } } template <typename T> vector<T> select(int n, T L, T R) { // [L,R] if (n * 2 >= R - L + 1) { vector<T> ret(R - L + 1); iota(ALL(ret), L); shuffle(ALL(ret)); ret.resize(n); return ret; } else { unordered_set<T> used; vector<T> ret; while (SZ(used) < n) { T x = get(L, R); if (!used.count(x)) { used.insert(x); ret.push_back(x); } } return ret; } } void relabel(int n, vector<pair<int, int>> &es) { shuffle(ALL(es)); vector<int> ord(n); iota(ALL(ord), 0); shuffle(ALL(ord)); for (auto &[u, v] : es) u = ord[u], v = ord[v]; } template <bool directed, bool multi, bool self> vector<pair<int, int>> genGraph(int n, int m) { vector<pair<int, int>> cand, es; rep(u, 0, n) rep(v, 0, n) { if (!self and u == v) continue; if (!directed and u > v) continue; cand.push_back({u, v}); } if (m == -1) m = get(SZ(cand)); // chmin(m, SZ(cand)); vector<int> ord; if (multi) rep(_, 0, m) ord.push_back(get(SZ(cand) - 1)); else { ord = select(m, 0, SZ(cand) - 1); } for (auto &i : ord) es.push_back(cand[i]); relabel(n, es); return es; } vector<pair<int, int>> genTree(int n) { vector<pair<int, int>> es; rep(i, 1, n) es.push_back({get(i - 1), i}); relabel(n, es); return es; } }; // namespace Random /** * @brief Random */ #line 4 "sol.cpp" int main() { int n; cin >> n; vector g(n, vector<int>()); using P = pair<int, int>; vector<P> es; rep(_, 0, n - 1) { int x, y; cin >> x >> y; x--, y--; es.push_back({x, y}); g[x].push_back(y); g[y].push_back(x); } auto ask = [&](vector<int> &X) -> bool { cout << "? "; for (auto &x : X) cout << x + 1 << ' '; cout << endl; string s; cin >> s; assert(s != "Invalid"); return s == "Yes"; }; vector<int> col(n); auto dfs = [&](auto &dfs, int v, int p) -> void { for (auto &to : g[v]) if (to != p) { col[to] = col[v] ^ 1; dfs(dfs, to, v); } }; col[0] = 0; dfs(dfs, 0, -1); int which = -1; { vector<int> C(n - 1); rep(i, 0, n - 1) { if (col[es[i].first]) C[i] = es[i].first; else C[i] = es[i].second; } if (ask(C)) which = 1; else which = 0; } vector<int> cand; rep(i, 0, n) if (col[i] == which) cand.push_back(i); while (SZ(cand) > 1) { rep(i, 0, n) col[i] = -1; for (auto &v : cand) col[v] = 0; vector<int> mid; rep(i, 0, SZ(cand) / 2) { mid.push_back(cand[i]); col[cand[i]] = 1; } vector<int> que; for (auto &[u, v] : es) { assert(col[u] == -1 or col[v] == -1); if (col[u]) que.push_back(u); else if (col[u] == 0) que.push_back(v); else if (col[v]) que.push_back(v); else if (col[v] == 0) que.push_back(u); else que.push_back(u); } which = -1; if (ask(que)) which = 1; else which = 0; vector<int> nxt; for (auto &v : cand) if (col[v] == which) { nxt.push_back(v); } swap(cand, nxt); } cout << "! " << cand[0] + 1 << endl; return 0; }