Submission #656518

#TimeUsernameProblemLanguageResultExecution timeMemory
656518Alex_tz307The Potion of Great Power (CEOI20_potion)C++17
100 / 100
964 ms31536 KiB
#include <bits/stdc++.h> using namespace std; const int kN = 1e5; const int INF = 1e9; const int kBucket = 200; int N, h[kN], bucketSize[kN]; vector<pair<int, int>> ev[kN]; vector<vector<int>> friends[kN]; bool ap[kN], inVec[kN]; void minSelf(int &x, int y) { if (y < x) { x = y; } } bool fcmp(const int &x, const int &y) { if (h[x] != h[y]) { return h[x] < h[y]; } return x < y; } vector<int> findList(const int &x, const int &t) { int l = 0, r = (int)ev[x].size() - 1, pos = -1; while (l <= r) { int mid = (l + r) / 2; if (ev[x][mid].first <= t) { pos = mid; l = mid + 1; } else { r = mid - 1; } } if (pos == -1) { return {}; } int bucket = (pos + 1) / bucketSize[x] - 1; vector<int> suff; for (int i = (bucket + 1) * bucketSize[x]; i <= pos; ++i) { if (!inVec[ev[x][i].second]) { suff.emplace_back(ev[x][i].second); inVec[ev[x][i].second] = true; } ap[ev[x][i].second] ^= 1; } vector<int> realSuff; for (const int &y : suff) { if (ap[y]) { realSuff.emplace_back(y); } ap[y] = false; inVec[y] = false; } suff = realSuff; sort(suff.begin(), suff.end(), fcmp); if (bucket < 0) { return suff; } vector<int> sol(friends[x][bucket].size() + suff.size()); merge(friends[x][bucket].begin(), friends[x][bucket].end(), suff.begin(), suff.end(), sol.begin(), fcmp); vector<int> realSol; for (int i = 0; i < (int)sol.size(); ++i) { int j = i; while (j < (int)sol.size() && sol[j] == sol[i]) { j += 1; } if ((j - i) % 2 == 1) { realSol.emplace_back(sol[i]); } i = j - 1; } return realSol; } void init(int n, int d, int H[]) { N = n; for (int i = 0; i < N; ++i) { h[i] = H[i]; } } void curseChanges(int U, int A[], int B[]) { for (int i = 0; i < U; ++i) { ev[A[i]].emplace_back(i + 1, B[i]); ev[B[i]].emplace_back(i + 1, A[i]); } vector<int> preff, realFriends; for (int x = 0; x < N; ++x) { if (ev[x].empty()) { continue; } bucketSize[x] = min((int)sqrt((int)ev[x].size()), kBucket); preff.clear(); for (int i = 0; i < (int)ev[x].size(); ++i) { if (!inVec[ev[x][i].second]) { preff.emplace_back(ev[x][i].second); inVec[ev[x][i].second] = true; } ap[ev[x][i].second] ^= 1; if (i % bucketSize[x] == bucketSize[x] - 1) { realFriends.clear(); for (const int &y : preff) { if (ap[y]) { realFriends.emplace_back(y); } else { inVec[y] = false; } } preff = realFriends; friends[x].emplace_back(preff); } } if ((int)ev[x].size() % bucketSize[x]) { realFriends.clear(); for (const int &y : preff) { if (ap[y]) { realFriends.emplace_back(y); } else { inVec[y] = false; } } preff = realFriends; friends[x].emplace_back(preff); } for (const int &y : preff) { ap[y] = false; inVec[y] = false; } for (int i = 0; i < (int)friends[x].size(); ++i) { sort(friends[x][i].begin(), friends[x][i].end(), fcmp); } } } int question(int x, int y, int v) { vector<int> X = findList(x, v); if (X.empty()) { return INF; } vector<int> Y = findList(y, v); if (Y.empty()) { return INF; } int res = INF, j = 0; for (int i = 0; i < (int)X.size(); ++i) { while (j < (int)Y.size() && h[Y[j]] <= h[X[i]]) { j += 1; } if (j < (int)Y.size()) { minSelf(res, h[Y[j]] - h[X[i]]); } if (j >= 1) { minSelf(res, h[X[i]] - h[Y[j - 1]]); } } return res; }
#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...