Submission #589928

#TimeUsernameProblemLanguageResultExecution timeMemory
589928piOOEThe Potion of Great Power (CEOI20_potion)C++17
38 / 100
3030 ms54996 KiB
#include <bits/stdc++.h> using namespace std; struct custom_hash { size_t operator()(uint64_t x) const { return x * 228 >> 4; } }; using ll = long long; template<typename T> using uset = unordered_set<T, custom_hash>; const int maxN = 100000, maxU = 200000, INF = 1000000000, BL = 300; int a[maxU], b[maxU], h[maxN], n, u, d; vector<uset<int>> g[maxN]; uset<int> temp[maxN]; vector<int> ti[maxN]; vector<pair<int, int>> c[maxN]; void init(int N, int D, int H[]) { n = N, d = D; memcpy(h, H, sizeof(h[0]) * n); } void curseChanges(int U, int A[], int B[]) { u = U; memcpy(a, A, sizeof(a[0]) * u), memcpy(b, B, sizeof(b[0]) * u); set<pair<int, int>> adj; for (int i = 0; i < u; ++i) { if (a[i] > b[i]) { swap(a[i], b[i]); } if (adj.count({a[i], b[i]})) { adj.erase({a[i], b[i]}); c[a[i]].emplace_back(~b[i], i + 1); c[b[i]].emplace_back(~a[i], i + 1); temp[a[i]].erase(b[i]); temp[b[i]].erase(a[i]); } else { adj.insert({a[i], b[i]}); c[a[i]].emplace_back(b[i], i + 1); c[b[i]].emplace_back(a[i], i + 1); temp[a[i]].insert(b[i]); temp[b[i]].insert(a[i]); } if (c[a[i]].size() % BL == 0) { g[a[i]].push_back(temp[a[i]]); ti[a[i]].push_back(i + 1); } if (c[b[i]].size() % BL == 0) { g[b[i]].push_back(temp[b[i]]); ti[b[i]].push_back(i + 1); } } } vector<int> get(int x, int v) { int it = upper_bound(ti[x].begin(), ti[x].end(), v) - ti[x].begin() - 1, t = 0; uset<int> ans; if (it > -1) { ans = g[x][it]; t = ti[x][it] + 1; } it = lower_bound(c[x].begin(), c[x].end(), make_pair(-1, t), [](pair<int, int> a, pair<int, int> b) { return a.second < b.second; }) - c[x].begin(); int cnt = 0; for (; it < int(c[x].size()) && c[x][it].second <= v; ++it) { auto [y, tt] = c[x][it]; if (y < 0) { ans.erase(~y); } else { ans.insert(y); } cnt += 1; } assert(cnt <= BL); vector<int> answer; for (int y: ans) { answer.push_back(y); } return answer; } int question(int x, int y, int v) { int ans = INF; vector<int> f = get(x, v), s = get(y, v); sort(s.begin(), s.end(), [](int i, int j) { return h[i] == h[j] ? i < j : h[i] < h[j]; }); for (int to: f) { auto it = lower_bound(s.begin(), s.end(), to, [](int i, int j) { return h[i] == h[j] ? i < j : h[i] < h[j]; }); if (it != s.end()) { ans = min(ans, h[*it] - h[to]); } if (it != s.begin()) { ans = min(ans, h[to] - h[*prev(it)]); } } return ans; }
#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...