Submission #595334

#TimeUsernameProblemLanguageResultExecution timeMemory
595334TimDeeHighway Tolls (IOI18_highway)C++14
0 / 100
17 ms1652 KiB
#include "highway.h" #include <bits/stdc++.h> using namespace std; void find_pair(int n,vector<int>u,vector<int>v,int a,int b) { int m=u.size(); vector<int>scuza(m,1); int dist=ask(scuza)/b; vector<int>d(n,0); vector<int>vis(n,0); vector<vector<pair<int,int>>>adj(n); for(int i=0;i<m;++i){ adj[u[i]].push_back({v[i],i}); adj[v[i]].push_back({u[i],i}); } vis[0]=1; queue<int>q; q.push(0); while (!q.empty()) { int u=q.front(); q.pop(); for(auto it:adj[u]) { int v=it.first; if (!vis[v]) { vis[v]=1; d[v]=d[u]+1; q.push(v); } } } vector<vector<int>>D(n); for(int i=0;i<n;++i) D[d[i]].push_back(i); int l=1,r=n-1; while(l<r) { int mid=(l+r)>>1; vector<int>paiu=scuza; for (int i=0;i<=mid;++i) for(auto u:D[i]) for(auto it:adj[u]) if(d[it.first]==d[u]-1) paiu[it.second]=0; int x=ask(paiu); if(x<dist*b) r=mid; else l=mid+1; } vector<int> amog=D[r]; l=0,r=amog.size()-1; while(l<r) { int mid=(l+r)>>1; vector<int>paiu=scuza; for(int i=l;i<mid;++i) for(auto it:adj[amog[i]]) if(d[it.first]==d[amog[i]]-1) paiu[it.second]=0; int x=ask(paiu); if(x<dist*b) r=mid; else l=mid+1; } int bgn=amog[r]; vis.assign(n,0); for(auto it:adj[bgn]) if(d[it.first]+1==d[bgn]) vis[it.first]=1; vis[bgn]=1; q.push(bgn); d.assign(n,1e9); d[bgn]=0; while (!q.empty()) { int u=q.front(); q.pop(); for(auto it:adj[u]) { int v=it.first; if(!vis[v]) {vis[v]=1; d[v]=d[u]+1; q.push(v);} } } D.assign(n,vector<int>(0)); for(int i=0;i<n;++i) if(d[i]!=1e9)D[d[i]].push_back(i); l=0,r=n-1; while (l<r) { int mid=(l+r)>>1; vector<int>paiu=scuza; for(int i=l;i<=mid;++i) for(auto u:D[i]) for(auto it:adj[u]) if(d[it.first]==d[u]-1) paiu[it.second]=0; int x=ask(paiu); if(x<b*dist) r=mid; else l=mid+1; } amog=D[r]; l=0,r=amog.size()-1; while(l<r) { int mid=(l+r)>>1; vector<int>paiu=scuza; for(int i=l;i<=mid;++i) for(auto it:adj[amog[i]]) if(d[it.first]==d[amog[i]]-1) paiu[it.second]=0; int x=ask(paiu); if(x<b*dist) r=mid; else l=mid+1; } int s=amog[r]; d.assign(n,0); vis.assign(n,0); vis[s]=1; q.push(s); while (!q.empty()) { int u=q.front(); q.pop(); for (auto it:adj[u]) { int v=it.first; if(!vis[v]) {vis[v]=1; d[v]=d[u]+1; q.push(v);} } } D.assign(n,vector<int>(0)); for(int i=0;i<n;++i) D[d[i]].push_back(i); amog=D[dist]; l=0,r=amog.size()-1; while(l<r) { int mid=(l+r)>>1; vector<int>paiu=scuza; for(int i=l;i<=mid;++i) for(auto it:adj[amog[i]]) if(d[it.first]==d[amog[i]]-1) paiu[it.second]=0; int x=ask(paiu); if(x<b*dist) r=mid; else l=mid+1; } int t=amog[r]; answer(s,t); }
#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...