Submission #1142320

#TimeUsernameProblemLanguageResultExecution timeMemory
1142320byunjaewooHighway Tolls (IOI18_highway)C++20
88 / 100
120 ms11476 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, ans1, ans2, d[N]; bool chk[N]; ll dist; vector<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(d, d+n, N), d[u]=d[v]=0, q.push(u), q.push(-v); while(!q.empty()) { int curr=q.front(); q.pop(); if(curr<0) { curr=-curr, chk[curr]=1; vt.push_back(curr); for(auto [next, w]:adj[curr]) if(d[next]==N) d[next]=d[curr]+1, q.push(-next); continue; } vs.push_back(curr); for(auto [next, w]:adj[curr]) if(d[next]==N) d[next]=d[curr]+1, q.push(next); } ans1=vs[0]; for(int s=0, e=vs.size()-1; s<e; ) { int mid=(s+e)/2; vector<int> vis(n, 0), tmp(m, 0); for(int i=mid+1; i<vs.size(); i++) vis[vs[i]]=1; for(int i=mid+1; i<vs.size(); i++) for(auto [j, w]:adj[vs[i]]) if(!vis[j]) tmp[w]=1; if(ask(tmp)==dist*A) e=mid; else s=mid+1, ans1=vs[mid+1]; } ans2=vt[0]; for(int s=0, e=vt.size()-1; s<e; ) { int mid=(s+e)/2; vector<int> vis(n, 0), tmp(m, 0); for(int i=mid+1; i<vt.size(); i++) vis[vt[i]]=1; for(int i=mid+1; i<vt.size(); i++) for(auto [j, w]:adj[vt[i]]) if(!vis[j]) tmp[w]=1; if(ask(tmp)==dist*A) e=mid; else s=mid+1, ans2=vt[mid+1]; } 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...