求助 65pts
查看原帖
求助 65pts
961972
Lele_Programmer楼主2024/12/13 22:39
#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define FRR(file) freopen(file,"r",stdin)
#define FRW(file) freopen(file,"w",stdout)
#define TIMESTAMP cerr<<fixed<<setprecision(3)<<clock()*1.0/CLOCKS_PER_SEC<<"s"<<endl;
#define _rep(i,a,b) for (int i=(a);i<=(b);++i)
#define _reps(i,a,b,c) for (int i=(a);i<=(b);c)
#define _rrep(i,a,b) for (int i=(a);i>=(b);--i)
#define _rreps(i,a,b,c) for (int i=(a);i>=(b);c)
#define _iter(i,a) for (auto i=a.begin();i!=a.end();++i)
#define _graph(i,u) for (int i=h[u];~i;i=ne[i])
#define rint register int
#define LL long long
typedef pair<int,int> pii;

const int N=100005;

int n;
int sz[N];
vector<int> vec[N];

extern "C" bool ask(int k);

void dfs(int u) {
    sz[u]=1;
    _iter(it,vec[u]) {
        dfs(*it);
        sz[u]+=sz[*it];
    }
}

extern "C" int solve(int n,vector<int> p) {
    // assert(ask(1)==1);
    _rep(i,0,(int)p.size()-1) vec[p[i]].emplace_back(i+2);
    dfs(1);
    int cur=1;
    int debug=1;
    vector<int> arr;
    while (true) {
        if (vec[cur].size()==1) {
            arr.emplace_back(cur);
            cur=vec[cur][0];
            continue;
        }
        if (vec[cur].empty()) {
            arr.emplace_back(cur);
            break;
        }
        if (sz[vec[cur][0]]<sz[vec[cur][1]]) swap(vec[cur][0],vec[cur][1]);
        int t=ask(vec[cur][0]);
        debug++;
        if (t) {
            arr.clear();
            cur=vec[cur][0];
            continue;
        }
        arr.emplace_back(cur);
        cur=vec[cur][1];
    }
    int l=0,r=(int)arr.size()-1;
    while (l<r) {
        int mid=(l+r>>1)+1;
        debug++;
        if (ask(arr[mid])) l=mid;
        else r=mid-1;
    }
    return arr[l];
}
2024/12/13 22:39
加载中...