제출 #1239074

#제출 시각아이디문제언어결과실행 시간메모리
1239074mychecksedadHighway Tolls (IOI18_highway)C++20
100 / 100
117 ms14624 KiB
#include "highway.h" #include<bits/stdc++.h> using namespace std; #define pb push_back #define vi vector<int> #define ff first #define all(x) x.begin(),x.end() #define ss second #define ll long long int #define pii pair<int,int> const int N = 2e5+100; int s[N], dep[N], PAR[N]; vector<pii> g[N]; bitset<N> VIS; void find_pair(int n, std::vector<int> U, std::vector<int> V, int A, int B) { int m = U.size(); for(int i = 0; i < m; ++i){ g[U[i]].pb({V[i], i}); g[V[i]].pb({U[i], i}); } vi w(m); ll val = ask(w); int k = val / A; int l = 0, r = m - 2, res = m-1; while(l <= r){ int mid = l+r>>1; w.clear(); w.resize(m); for(int j = 0; j <= mid; ++j) w[j] = 1; ll y = ask(w); if(y != val){ res = mid; r = mid - 1; }else{ l = mid + 1; } } int x = U[res]; int y = V[res]; queue<int> q; q.push(x); vector<int> D(n, -1); vector<int> D1(n, -1); vi par1(n, -1); vi par2(n, -1); D[x] = 0; while(!q.empty()){ int v = q.front(); q.pop(); for(auto [u, id]: g[v]){ if(D[u] == -1){ D[u] = D[v] + 1; par1[u] = id; q.push(u); } } } q.push(y); D1[y] = 0; while(!q.empty()){ int v = q.front(); q.pop(); for(auto [u, id]: g[v]){ if(D1[u] == -1){ D1[u] = D1[v] + 1; par2[u] = id; q.push(u); } } } vector<pii> X, Y; for(int i = 0; i < n; ++i){ if(D[i] < D1[i]) X.pb({D[i], i}); else if(D1[i] < D[i]) Y.pb({D1[i], i}); } sort(all(X)); int ress = res; l = 0, r = int(X.size()) - 1, res = 0; while(l <= r){ int mid = l+r>>1; w.clear(); w.resize(m, 1); for(auto [d, v]: Y) if(par2[v] != -1) w[par2[v]] = 0; w[ress] = 0; for(int i = 0; i <= mid; ++i) if(par1[X[i].ss] != -1) w[par1[X[i].ss]] = 0; ll y = ask(w); if(y == val){ res = mid; r = mid - 1; }else{ l = mid + 1; } } int s = X[res].ss; sort(all(Y)); l = 0, r = int(Y.size()) - 1, res = 0; while(l <= r){ int mid = l+r>>1; w.clear(); w.resize(m, 1); for(auto [d, v]: X) if(par1[v] != -1) w[par1[v]] = 0; w[ress] = 0; for(int i = 0; i <= mid; ++i) if(par2[Y[i].ss] != -1) w[par2[Y[i].ss]] = 0; ll y = ask(w); if(y == val){ res = mid; r = mid - 1; }else{ l = mid + 1; } } int t = Y[res].ss; // cerr << s << ' ' << t << '\n'; 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...