Submission #714328

#TimeUsernameProblemLanguageResultExecution timeMemory
714328victor_gaoHighway Tolls (IOI18_highway)C++17
51 / 100
163 ms18384 KiB
#include "highway.h" #include<bits/stdc++.h> #define ll long long #define pii pair<ll,ll> #define x first #define y second using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); vector<pii>g[90015]; vector<ll>all[90015][2],root[2]; vector<int>qry; ll n,m,mx[2],mn,a,b,d,fa[90015],dep[90015]; void bfs(int r1,int r2){ for (int i=0;i<=n;i++){ fa[i]=0; dep[i]=0; mx[0]=1; mx[1]=1; all[i][0].clear(); all[i][1].clear(); } queue<pii>q; q.push({r1,0}); q.push({r2,1}); dep[r1]=1; dep[r2]=1; fa[r1]=-1; fa[r2]=-1; while (!q.empty()){ auto [p,rt]=q.front(); q.pop(); root[rt].push_back(p); all[dep[p]][rt].push_back(p); mx[rt]=max(mx[rt],dep[p]); for (auto [i,idx]:g[p]){ if (!dep[i]){ dep[i]=dep[p]+1; fa[i]=idx; qry[fa[i]]=0; q.push({i,rt}); } } } } int find(int f,int p){ if (p==1) return all[p][f][0]; ll l=0,r=all[p][f].size(); while (l<r){ int mid=(l+r)>>1; for (int j=l;j<=mid;j++) qry[fa[all[p][f][j]]]=1; ll dis=ask(qry); for (int j=l;j<=mid;j++) qry[fa[all[p][f][j]]]=0; if (dis>mn) r=mid; else l=mid+1; } return all[p][f][l]; } void solve1(int u,int v,int _i){ fill(qry.begin(),qry.end(),1); qry[_i]=0; bfs(u,v); for (int i=0;i<=n;i++){ for (auto j:all[i][0]){ if (fa[j]!=-1) qry[fa[j]]=1; } } ll ldep=ask(qry); for (int i=0;i<=n;i++){ for (auto j:all[i][0]){ if (fa[j]!=-1) qry[fa[j]]=0; } } ldep=(ldep-mn)/(b-a); int s=find(0,ldep+1),t=find(1,d-ldep); answer(s,t); return; } void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) { n=N; m=U.size(); a=A; b=B; for (int i=0;i<m;i++){ g[U[i]].push_back({V[i],i}); g[V[i]].push_back({U[i],i}); } qry.resize(m,0); mn=ask(qry); d=mn/A; int l=0,r=m-1,u,v; while (l<r){ int mid=(l+r)>>1; for (int i=l;i<=mid;i++) qry[i]=1; ll now=ask(qry); for (int i=l;i<=mid;i++) qry[i]=0; if (now!=mn) r=mid; else l=mid+1; } u=U[l]; v=V[l]; solve1(u,v,l); } /* ./rand ./highway 4 4 1 3 1 3 0 1 0 2 0 3 1 2 */
#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...