Submission #1238932

#TimeUsernameProblemLanguageResultExecution timeMemory
1238932LeonidCukHighway Tolls (IOI18_highway)C++17
51 / 100
247 ms327680 KiB
#include "highway.h" #include <bits/stdc++.h> using namespace std; int n,m,timer=0; vector<vector<pair<int,int>>>g; vector<int>es,en,tour; void dfs(int a,int b) { es[a]=timer;timer++; for(auto i:g[a]) { if(i.first!=b) { tour.push_back(i.second); dfs(i.first,a); } } en[a]=timer-1; } bool check(int a,int b) { return es[a]<=es[b]&&en[b]<=en[a]; } void find_pair(int N,vector<int> U,vector<int> V, int A, int B) { n=N; m=U.size(); g.resize(n); es.resize(n); en.resize(n); for(int i=0;i<m;i++) { g[U[i]].push_back({V[i],i}); g[V[i]].push_back({U[i],i}); } vector<int>v(m); long long sum=ask(v); dfs(0,0); int l=0,r=m-1; while(r>l) { int mid=(l+r+1)/2; for(int i=mid;i<m;i++)v[tour[i]]=1; long long temp=ask(v); for(int i=mid;i<m;i++)v[tour[i]]=0; if(temp!=sum)l=mid; else r=mid-1; } int x,y; if(check(U[tour[l]],V[tour[l]]))x=V[tour[l]]; else x=U[tour[l]]; while(!tour.empty())tour.pop_back(); timer=0; dfs(x,x); l=0;r=m-1; while(r>l) { int mid=(l+r+1)/2; for(int i=mid;i<m;i++)v[tour[i]]=1; long long temp=ask(v); for(int i=mid;i<m;i++)v[tour[i]]=0; if(temp!=sum)l=mid; else r=mid-1; } if(check(U[tour[l]],V[tour[l]]))y=V[tour[l]]; else y=U[tour[l]]; answer(x,y); }
#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...