제출 #799348

#제출 시각아이디문제언어결과실행 시간메모리
799348NothingXD통행료 (IOI18_highway)C++17
51 / 100
155 ms18348 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; vector<int> g[maxn], t[maxn]; bool mark[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; 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 (h[u] == -1){ h[u] = h[v] + 1; par[u] = x; st[u] = ++tme; ver[tme] = u; mark[x] = false; q.push(u); } } } } 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); int l = -1, r = n-1; while(l + 1 < r){ vector<int> q(m, 0); int mid = (l + r) >> 1; for (int i = 0; i < n; i++){ for (auto x: g[i]){ q[x] = 1; } } if (ask(q) == dis) l = mid; else r = mid; } // debug(r); bfs(r); // for (int i = 0; i < m; i++) debug(i, mark[i]); l = 0, r = n; 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 < n; 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 = 0, r = n; 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 < n; 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...