Submission #796048

#TimeUsernameProblemLanguageResultExecution timeMemory
796048NeroZeinThe Potion of Great Power (CEOI20_potion)C++17
56 / 100
3023 ms109608 KiB
#include <bits/stdc++.h> using namespace std; const int INF = 1e9; const int MX_N = 1e5 + 5; const int MX_DAYS = 2e5 + 5; const int MX_NODES = (MX_N + MX_DAYS) * 30; int idd; int ppl; int h[MX_N]; map<int, int> to; set<pair<int, int>> friends; vector<pair<int, int>> versions[MX_N]; int tree[MX_NODES]; int root[MX_NODES]; int L[MX_NODES], R[MX_NODES]; int upd (int nd, int l, int r, int p, int v) { int nx = ++idd; if (l == r) { tree[nx] = tree[nd] + v; return nx; } int mid = (l + r) >> 1; if (p <= mid) { L[nx] = upd(L[nd], l, mid, p, v); R[nx] = R[nd]; } else { L[nx] = L[nd]; R[nx] = upd(R[nd], mid + 1, r, p, v); } tree[nx] = tree[L[nx]] + tree[R[nx]]; return nx; } void dive (int nd, int l, int r, vector<int>& vec) { if (l == r) { vec.push_back(l); return; } int mid = (l + r) >> 1; if (L[nd] && tree[L[nd]]) { dive(L[nd], l, mid, vec); } if (R[nd] && tree[R[nd]]) { dive(R[nd], mid + 1, r, vec); } } pair<int, int> invert (int u, int v, int uVersion, int vVersion) { int rootU, rootV; if (friends.count({u, v})) { rootU = upd(uVersion, 0, ppl - 1, h[v], -1); rootV = upd(vVersion, 0, ppl - 1, h[u], -1); friends.erase({u, v}); } else { rootU = upd(uVersion, 0, ppl - 1, h[v], +1); rootV = upd(vVersion, 0, ppl - 1, h[u], +1); friends.emplace(u, v); } return make_pair(rootU, rootV); } void compress () { map<int, int> mp; int cnt = 0; for (int i = 0; i < ppl; ++i) { mp[h[i]]; } for (auto& it : mp) { it.second = cnt++; } for (int i = 0; i < ppl; ++i) { to[mp[h[i]]] = h[i]; h[i] = mp[h[i]]; } } void init(int N, int D, int H[]) { ppl = N; for (int i = 0; i < ppl; ++i) { h[i] = H[i]; versions[i].emplace_back(0, ++idd); } compress(); } void curseChanges(int U, int A[], int B[]) { for (int day = 1; day <= U; ++day) { int u = A[day - 1], v = B[day - 1]; if (u > v) swap(u, v); int verU = versions[u].back().second; int verV = versions[v].back().second; auto [ru, rv] = invert(u, v, verU, verV); versions[u].emplace_back(day, ru); versions[v].emplace_back(day, rv); } } int getDis (vector<int> h1, vector<int> h2) { if (h1.empty() || h2.empty()) { return INF; } int ret = INF; int i = 0, j = 0; int n = h1.size(), m = h2.size(); while (i < n || j < m) { if (i < n && (j == m || h1[i] < h2[j])) { if (j < m) { ret = min(ret, to[h2[j]] - to[h1[i]]); } i++; } else { if (i < n) { ret = min(ret, to[h1[i]] - to[h2[j]]); } j++; } } return ret; } int question(int u, int v, int day) {//p1, p2, day pair<int,int> verV = *prev(lower_bound(versions[v].begin(), versions[v].end(), make_pair(day, INF))); pair<int,int> verU = *prev(lower_bound(versions[u].begin(), versions[u].end(), make_pair(day, INF))); vector<int> h1, h2; dive(verV.second, 0, ppl - 1, h1); dive(verU.second, 0, ppl - 1, h2); //cout << "U, V: " << u << ' ' << v << '\n'; //cout << "VALS OF U'S FRIENDS: "; //for (int i : h1) { //cout << to[i] << ' '; //} //cout << '\n'; //cout << "VALS OF V'S FRIENDS: "; //for (int i : h2) { //cout << to[i] << ' '; //} //cout << '\n'; return getDis(h1, h2); }
#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...