Submission #1364151

#TimeUsernameProblemLanguageResultExecution timeMemory
1364151settopHighway Tolls (IOI18_highway)C++20
51 / 100
74 ms11284 KiB
#include "highway.h"
#include<bits/stdc++.h>

using namespace std;
#define ll long long
#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define sz(x) (int) x.size()
#define pb push_back
#define all(x) x.begin(),x.end()
const int MAXN=2e5+10;
typedef pair<int,int> pii;

int n,dp[MAXN];
vector<pii> g[MAXN];

void bfs(int x){
  fall(i,0,n-1) dp[i]=MAXN;
  queue<int> fila; fila.push(x); dp[x]=0;
  while(sz(fila)){
    auto a=fila.front(); fila.pop();
    for(auto [u,j]:g[a]) if(dp[u]==MAXN){dp[u]=dp[a]+1;fila.push(u);}
  }
}

void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) {
  n=N;
  fall(i,0,sz(V)-1){
    g[V[i]].pb({U[i],i});
    g[U[i]].pb({V[i],i});
  }
  vector<int> w(sz(V));
  int dist=ask(w);

  auto dnc=[&](auto &&self,vector<int> cand)->int{
    if(sz(cand)==1) return cand[0];
    for(auto&x:w)x=0;
    vector<int> nc[2];
    fall(i,0,sz(cand)/2-1) nc[0].pb(cand[i]);
    fall(i,sz(cand)/2,sz(cand)-1) nc[1].pb(cand[i]);
    for(auto x:nc[0])
      for(auto [u,j]:g[x]) w[j]=1;
    int dd=ask(w);
    if(dd==dist) return self(self,nc[1]);
    return self(self,nc[0]);
  };

  vector<int> al(n); iota(all(al),0);
  int in_path=dnc(dnc,al);
  bfs(in_path);
  vector<int> cand(n); iota(all(cand),0);
  sort(all(cand),[&](int a,int b){
    return dp[a]>dp[b];
  });
  while(sz(cand)>1){
    vector<int> nc[2];
    for(auto&x:w)x=0;
    fall(i,0,sz(cand)/2-1) nc[0].pb(cand[i]);
    fall(i,sz(cand)/2,sz(cand)-1) nc[1].pb(cand[i]);
    for(auto x:nc[0])
      for(auto [u,j]:g[x]) w[j]=1;
    int dd=ask(w);
    if(dd==dist) cand=nc[1];
    else cand=nc[0];
  }
  int ans=cand[0];
  cand.resize(n); iota(all(cand),0);
  bfs(ans);
  sort(all(cand),[&](int a,int b){
    return dp[a]>dp[b];
  });
  while(sz(cand)>1){
    vector<int> nc[2];
    for(auto&x:w)x=0;
    fall(i,0,sz(cand)/2-1) nc[0].pb(cand[i]);
    fall(i,sz(cand)/2,sz(cand)-1) nc[1].pb(cand[i]);
    for(auto x:nc[0])
      for(auto [u,j]:g[x]) w[j]=1;
    int dd=ask(w);
    if(dd==dist) cand=nc[1];
    else cand=nc[0];
  }
  answer(ans,cand[0]);
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...