제출 #236759

#제출 시각아이디문제언어결과실행 시간메모리
236759lyc통행료 (IOI18_highway)C++14
100 / 100
313 ms10988 KiB
#include "highway.h" #include <bits/stdc++.h> using namespace std; #define TRACE(x) cout << #x << " :: " << x << endl; #define _ << " " << #define FOR(i,a,b) for(int i=(a);i<=(b);++i) #define RFOR(i,a,b) for(int i=(a);i>=(b);--i) #define SZ(x) ((int)(x).size()) #define ALL(x) (x).begin(),(x).end() typedef long long ll; typedef pair<int,int> ii; const int mxN = 90005; const int mxM = 130005; int N, M, A, B; int E[mxM]; vector<int> al[mxN], num; vector<ii> pa; vector<int> w; ll L; int qcnt = 0; bool query() { ++qcnt; assert(qcnt <= 100); ll r = ask(w); //cout << qcnt << " :: "; //FOR(i,0,M-1) cout << w[i] << ' '; //cout << " :: " << r << endl; return r == L; } void bfs(vector<int> s) { int cnt = 0; num.assign(N,-1); pa.assign(N,ii(-1,-1)); queue<int> q; for (auto& u : s) { num[u] = cnt++, pa[u].second = u, q.push(u); } while (!q.empty()) { int u = q.front(); q.pop(); for (int e : al[u]) { int v = E[e]^u; if (num[v] == -1) { num[v] = cnt++, pa[v] = ii(e,pa[u].second), q.push(v); } } } } void setW(vector<int>::iterator s, vector<int>::iterator e, int p) { vector<int> vis(N,0); for (auto it = s; it != e; ++it) { for (int x = *it; pa[x].first != -1 && !vis[x]; x = E[pa[x].first]^x) { vis[x] = 1; w[pa[x].first] = p; } } } int solve(int s) { vector<int> vtx; FOR(i,0,N-1) if (pa[i].second == s) vtx.push_back(i); sort(ALL(vtx),[](int a, int b) { return num[a] < num[b]; }); //cout << "VTX: "; //for (auto& x : vtx) cout << x << ' '; //cout << endl; setW(ALL(vtx),1); int lo = -1, hi = SZ(vtx)-1; while (hi-lo > 1) { int mid = (lo+hi)/2; setW(vtx.begin(),vtx.begin()+mid+1,0); if (query()) hi = mid; else lo = mid; setW(vtx.begin(),vtx.begin()+mid+1,1); } setW(ALL(vtx),0); //TRACE(hi _ vtx[hi]); return vtx[hi]; } void find_pair(int _N, vector<int> U, vector<int> V, int _A, int _B) { N = _N; M = U.size(); FOR(i,0,M-1){ E[i] = U[i]^V[i]; al[U[i]].push_back(i); al[V[i]].push_back(i); } A = _A, B = _B; w.assign(M,0); L = ask(w); int lo = -1, hi = M; while (hi-lo > 1) { int mid = (lo+hi)/2; FOR(i,lo+1,mid) w[i] = 1; if (query()) lo = mid; else { FOR(i,lo+1,mid) w[i] = 0; hi = mid; } } bfs({U[hi],V[hi]}); w.assign(M,1); vector<int> vtx(N); iota(ALL(vtx),0); setW(ALL(vtx),0); w[hi] = 0; int S = solve(U[hi]), T = solve(V[hi]); //TRACE(S _ T); 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...