Submission #130552

#TimeUsernameProblemLanguageResultExecution timeMemory
130552groeneprof통행료 (IOI18_highway)C++14
51 / 100
408 ms262144 KiB
#include "highway.h" #include <bits/stdc++.h> #define int long long using namespace std; struct edge{ int id, v; }; int N, M, A, B; vector<vector<edge> > graph; void dfs(int u, int par, int id, int d, int dist, vector<int>& idlist, vector<int>& vlist){ if(d == dist){ idlist.push_back(id); vlist.push_back(u); } for(edge e : graph[u]) if(e.v!=par){ dfs(e.v, u, e.id, d+1, dist, idlist, vlist); } } int findT(int S, int par, int dist, int id, int dist2){ vector<int> idlist, vlist; dfs(S, par, id, 0, dist, idlist, vlist); int L = 0, R = idlist.size(); //for(int i : vlist) //cout<<i<<" "; //cout<<endl; //for(int i : idlist) //cout<<i<<" "; //cout<<endl; while(L!=R-1){ //cout<<"L: "<< L<< " R: "<<R<<endl; int Mi = (L+R)/2; vector<signed> w(M, 0); for(int i = L; i<Mi; i++){ w[idlist[i]]=1; } //cout<<ask(w)<<endl; if(ask(w)==dist2*A){ L = Mi; } else{ R = Mi; } } return vlist[L]; } int findedge(int dist){ int L = 0, R = M; while(L!=R-1){ int Mi = (L+R)/2; vector<signed> w(M, 0); for(int i = L; i<Mi; i++){ w[i]=1; } if(ask(w)==dist*A){ L = Mi; } else{ R = Mi; } } return L; } void dfs2(int u, int par, int id, vector<signed> & w){ w[id] = 1; for(edge e : graph[u]) if(e.v!=par){ dfs2(e.v, u, e.id, w); } } void find_pair(signed _N, vector<signed> U, vector<signed> V, signed _A, signed _B) { N = _N; M = U.size(); A = _A; B = _B; graph.resize(N); for(int i = 0; i<M; i++){ graph[U[i]].push_back({i, V[i]}); graph[V[i]].push_back({i, U[i]}); } vector<signed> w(M, 0); int dist = ask(w)/A; int ed = findedge(dist); //cout<<"edge: "<<U[ed]<<" "<<V[ed]<<endl; dfs2(V[ed], U[ed], ed, w); int d1 = (ask(w)-dist*A)/(B-A)-1; int d2 = dist - d1 - 1; //cout<<"d1: "<<d1<<" d2: "<<d2<<endl; int S = findT(V[ed], U[ed], d1, ed, dist); int T = findT(U[ed], V[ed], d2, ed, dist); 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...