제출 #624084

#제출 시각아이디문제언어결과실행 시간메모리
624084Ronin13통행료 (IOI18_highway)C++14
51 / 100
288 ms35928 KiB
#include "highway.h" #include<bits/stdc++.h> #define ll long long #define ull unsigned ll #define f first #define s second #define pii pair<int,int> #define pll pair<ll,ll> #define pb push_back #define epb emplace_back using namespace std; const int NMAX = 1e6 + 1; vector <vector <int> > g(NMAX); int d[NMAX]; vector <int> p(NMAX, -1); int n; ll a, b; void bfs(int s){ d[s] = 0; for(int i = 0; i < n; i++){ p[i] = -1; d[i] = 1e9; } queue <int> q; q.push(s); int cnt = 1; p[s] = 0; d[s] = 0; while(!q.empty()){ int v = q.front(); q.pop(); for(int to : g[v]){ if(p[to] != -1) continue; d[to] = cnt++; p[to] = v; q.push(to); } } } void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) { vector <int> bb; n = N; int m = U.size(); for(int i = 0; i < m; i++){ bb.pb(0); g[U[i]].pb(V[i]); g[V[i]].pb(U[i]); } a = A; b = B; const vector <int> vv = bb; ll mn = ask(bb); bfs(0); int l = 0, r = n; while(l + 1 < r){ int mid = (l + r) / 2; vector <int> vec; for(int i = 0; i < m; i++){ if(d[U[i]] <= mid && d[V[i]] <= mid)vec.pb(0); else vec.pb(1); } const vector <int> vv = vec; ll x = ask(vv); if(x == mn) r = mid; else l = mid; } for(int i = 0; i < n; i++) if(d[i] == r) { r = i; break; } bfs(r); int l1 = 0, r1 = n; while(l1 + 1 < r1){ int mid = (l1 + r1) / 2; vector <int> vec; for(int i = 0; i < m; i++){ if(d[U[i]] <= mid && d[V[i]] <= mid) vec.pb(0); else vec.pb(1); } const vector <int> vv = vec; ll x = ask(vv); if(x == mn) r1 = mid; else l1 = mid; } for(int i = 0; i < n; i++) if(d[i] == r1){ r1 = i; break; } answer(r, r1); }
#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...