Submission #1142300

#TimeUsernameProblemLanguageResultExecution timeMemory
1142300byunjaewooHighway Tolls (IOI18_highway)C++20
5 / 100
161 ms11748 KiB
#include "highway.h"
#include <bits/stdc++.h>
using namespace std;
using ll=long long;

const int N=90010;
int n, m, p, u, v, dist, ans1, ans2, du[N], dv[N];
vector<pair<int, int>> vs, vt;
queue<int> q;
vector<pair<int, int>> adj[N];

void find_pair(int N, vector<int> U, vector<int> V, int A, int B) {
  n=N, m=U.size();
  for(int i=0; i<m; i++) adj[U[i]].push_back({V[i], i}), adj[V[i]].push_back({U[i], i});
  vector<int> tmp(m, 0);
  dist=ask(tmp)/A;
  for(int s=0, e=m-1; s<e; ) {
    int mid=(s+e)/2;
    vector<int> tmp(m, 0);
    for(int j=0; j<=mid; j++) tmp[j]=1;
    if(ask(tmp)==dist*A) p=s=mid+1;
    else e=mid;
  }
  u=U[p], v=V[p];
  fill(du, du+n, N), du[u]=0, q.push(u);
  while(!q.empty()) {
    int curr=q.front(); q.pop();
    for(auto [next, w]:adj[curr]) if(du[next]==N) du[next]=du[curr]+1, q.push(next);
  }
  fill(dv, dv+n, N), dv[v]=0, q.push(v);
  while(!q.empty()) {
    int curr=q.front(); q.pop();
    for(auto [next, w]:adj[curr]) if(dv[next]==N) dv[next]=dv[curr]+1, q.push(next);
  }
  for(int i=0; i<n; i++) {
    if(du[i]<dv[i]) vs.push_back({du[i], i});
    else vt.push_back({dv[i], i});
  }
  sort(vs.begin(), vs.end()), sort(vt.begin(), vt.end());
  ans1=vs[0].second;
  for(int s=0, e=vs.size()-1; s<e; ) {
    int mid=(s+e)/2;
    vector<int> tmp(m, 0);
    for(int i=mid+1; i<vs.size(); i++) for(auto [j, w]:adj[vs[i].second]) if(du[j]<dv[j] && du[j]<du[vs[i].second]) tmp[w]=1;
    if(ask(tmp)==dist*A) e=mid;
    else s=mid+1, ans1=vs[mid+1].second;
  }
  ans2=vt[0].second;
  for(int s=0, e=vt.size()-1; s<e; ) {
    int mid=(s+e)/2;
    vector<int> tmp(m, 0);
    for(int i=mid+1; i<vt.size(); i++) for(auto [j, w]:adj[vt[i].second]) if(du[j]>dv[j] && dv[j]<dv[vt[i].second]) tmp[w]=1;
    if(ask(tmp)==dist*A) e=mid;
    else s=mid+1, ans2=vt[mid+1].second;
  }
  answer(ans1, ans2);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...