제출 #1290186

#제출 시각아이디문제언어결과실행 시간메모리
1290186PlayVoltz통행료 (IOI18_highway)C++20
69 / 100
108 ms16140 KiB
#include "highway.h" #include <bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define mp make_pair #define pb push_back #define fi first #define se second int n, m, k, a, b; vector<vector<pii> > adj; int calc(int start){ vector<pii> ord; vector<int> dj(n, -1); queue<int> q; dj[start]=0; q.push(start); while (q.size()){ int node=q.front(); q.pop(); for (auto num:adj[node])if (dj[num.fi]==-1)dj[num.fi]=dj[node]+1, q.push(num.fi), ord.pb(mp(num.fi, num.se)); } int low=-1, high=ord.size()-1; while (low+1<high){ int mid=(low+high)/2; vector<signed> temp(m, 1); for (auto a:ord)temp[a.se]=0; for (int i=mid; i<ord.size(); ++i)temp[ord[i].se]=1; if (k==ask(temp))high=mid; else low=mid; } return ord[low].fi; } void find_pair(signed N, vector<signed> u, vector<signed> v, signed A, signed B){ n=N, m=u.size(), a=A, b=B; adj.clear(); adj.resize(n); vector<pii> ord; vector<signed> temp(m, 0); k=ask(temp); for (int i=0; i<m; ++i){ adj[u[i]].pb(mp(v[i], i)); adj[v[i]].pb(mp(u[i], i)); } int low=0, high=m; while (low+1<high){ int mid=(low+high)/2; vector<signed> temp(m, 0); for (int i=0; i<mid; ++i)temp[i]=1; if (ask(temp)==k)low=mid; else high=mid; } int s=calc(u[low]), t=calc(s); 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...