| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 1220387 | mariamtsagareli | Easter Eggs (info1cup17_eastereggs) | C++20 | 0 ms | 0 KiB | 
#include <bits/stdc++.h>
using namespace std;
int q(const vector<int>& v) {
    cout << "? " << v.size();
    for (int x : v) cout << ' ' << x;
    cout << '\n' << flush;
    int r; cin >> r;
    return r;
}
int findEgg(int N, const vector<pair<int,int>>& B) {
    vector<vector<int>> g(N+1);
    for (auto& e : B) {
        g[e.first].push_back(e.second);
        g[e.second].push_back(e.first);
    }
    vector<int> s(N+1,1), z(N+1), p(N+1), t;
    function<int(int,int)> d = [&](int u,int par) {
        p[u]=par; z[u]=1; t.push_back(u);
        for (int w: g[u]) if (w!=par && s[w]) z[u]+=d(w,u);
        return z[u];
    };
    function<int()> f = [&]() {
        t.clear(); int r=1;
        while (!s[r]) r++;
        d(r,0);
        int m=t.size();
        for (int u: t) {
            int mx=m-z[u];
            for (int w: g[u]) if (w!=p[u] && s[w]) mx=max(mx,z[w]);
            if (mx*2<=m) return u;
        }
        return t[0];
    };
    function<void(int,int,vector<int>&)> e = [&](int u,int par,vector<int>& c) {
        c.push_back(u);
        for (int w: g[u]) if (w!=par && s[w]) e(w,u,c);
    };
    while (1) {
        vector<int> cand;
        for (int i=1;i<=N;i++) if (s[i]) cand.push_back(i);
        if (cand.size()==1) return cand[0];
        int u=f();
        if (q(vector<int>{u})) return u;
        vector<vector<int>> A;
        for (int w: g[u]) if (s[w]) {
            vector<int> tmp; e(w,u,tmp);
            A.push_back(tmp);
        }
        int l=0,r=A.size();
        while (r-l>1) {
            int m=(l+r)/2;
            vector<int> v={u};
            for (int i=l;i<m;i++) for (int x:A[i]) v.push_back(x);
            if (q(v)) r=m;
            else l=m;
        }
        vector<int> K=A[l];
        fill(s.begin(),s.end(),0);
        for (int x:K) s[x]=1;
    }
}
