제출 #799420

#제출 시각아이디문제언어결과실행 시간메모리
799420NothingXD통행료 (IOI18_highway)C++17
6 / 100
101 ms12964 KiB
#include "highway.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef double ld; typedef complex<ld> point; void debug_out(){cerr << endl;} template<typename Head, typename... Tail> void debug_out(Head H, Tail... T){ cerr << H << ' '; debug_out(T...); } #define debug(...) cerr << "(" << #__VA_ARGS__ << "): ", debug_out(__VA_ARGS__) #define F first #define S second #define all(x) x.begin(), x.end() #define MP(x, y) make_pair(x, y) const int maxn = 2e5 + 10; int n, m, h[maxn], par[maxn], st[maxn], ver[maxn], tme, edge[maxn][2], cnt, sz; vector<int> g[maxn]; bool mark[maxn]; bool bad[maxn]; void bfs(int V){ memset(h, -1, sizeof h); memset(par, -1, sizeof par); memset(mark, true, sizeof mark); queue<int> q; q.push(V); tme = 0; h[V] = 0; st[V] = 0; par[V] = -1; ver[0] = V; while(!q.empty()){ int v = q.front(); //debug(v, h[v], par[v], st[v], ver[st[v]]); q.pop(); for (auto x: g[v]){ int u = edge[x][0]^edge[x][1]^v; if (!bad[u] && h[u] == -1){ h[u] = h[v] + 1; par[u] = x; st[u] = ++tme; ver[tme] = u; mark[x] = false; q.push(u); } } } //assert(tme == sz-1); } void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) { n = N; m = U.size(); for (int i = 0; i < m; i++){ edge[i][0] = U[i]; edge[i][1] = V[i]; g[U[i]].push_back(i); g[V[i]].push_back(i); } vector<int> q(m, 0); ll dis = ask(q); //debug(dis); int l = -1, r = n-1; int x = 1, y = 2; while(l + 1 < r){ vector<int> q(m, 0); int diff = r - l; int mid = l + diff * x / y; mid = max(mid, l+1); mid = min(mid, r-1); //debug(l, r, mid); for (int i = 0; i <= mid; i++){ for (auto x: g[i]){ q[x] = 1; } } //for (int i = 0; i < m; i++) debug(i, q[i]); if (ask(q) == dis) l = mid; else r = mid; } for (int i = 0; i < r; i++){ bad[i] = true; } // debug(r); bfs(r); // for (int i = 0; i < m; i++) debug(i, mark[i]); l = 0, r = tme+1; while(l + 1 < r){ vector<int> q(m, 0); int mid = (l + r) >> 1; // debug(mid); for (int i = 0; i < m; i++) q[i] = mark[i]; for (int i = mid; i < sz; i++){ q[par[ver[i]]] = 1; } // for (int i = 0; i < m; i++) debug(i, q[i]); if (ask(q) == dis) r = mid; else l = mid; } int S = ver[l]; bfs(S); // debug(S); // for (int i = 0; i < m; i++) debug(i, mark[i]); l = tme+1, r = 0; for (int i = 0; i < tme+1; i++){ // debug(i, ver[i], h[ver[i]] * A, dis); if (1ll * h[ver[i]] * A == dis){ l = min(l, i); r = max(r, i); } } r++; while(l + 1 < r){ vector<int> q(m, 0); int mid = (l + r) >> 1; // debug(mid); for (int i = 0; i < m; i++) q[i] = mark[i]; for (int i = mid; i < sz; i++){ q[par[ver[i]]] = 1; } //for (int i = 0; i < m; i++) debug(i, q[i]); if (ask(q) == dis) r = mid; else l = mid; } // debug(ver[l]); answer(S, ver[l]); }
#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...