Submission #865890

#TimeUsernameProblemLanguageResultExecution timeMemory
865890NeroZeinThe Potion of Great Power (CEOI20_potion)C++17
38 / 100
1043 ms262144 KiB
#include "bits/stdc++.h" using namespace std; const int S = 1; const int MAX_N = 2e5 + 5; int n; int h[MAX_N]; void init(int N, int D, int H[]) { n = N; for (int i = 0; i < N; ++i) { h[i] = H[i]; } } set<int> f[MAX_N]; int a[MAX_N], b[MAX_N]; vector<int> chng[MAX_N]; vector<set<int>> st[MAX_N]; void edit(set<int>& se, int z) { if (se.count(z)) se.erase(z); else se.insert(z); } void curseChanges(int U, int A[], int B[]) { for (int i = 1; i <= U; ++i) { a[i] = A[i - 1], b[i] = B[i - 1]; } for (int i = 0; i < n; ++i) { chng[i].push_back(0); st[i].emplace_back(f[i]); } for (int i = 1; i <= U; ++i) { chng[a[i]].push_back(i); chng[b[i]].push_back(i); edit(f[a[i]], b[i]); edit(f[b[i]], a[i]); if (chng[a[i]].size() % S == 0) { st[a[i]].emplace_back(f[a[i]]); } if (chng[b[i]].size() % S == 0) { st[b[i]].emplace_back(f[b[i]]); } } } int get(set<int>& x, set<int>& y) { vector<int> cx, cy; for (auto i : x) cx.push_back(h[i]); for (auto i : y) cy.push_back(h[i]); sort(cx.begin(), cx.end()); sort(cy.begin(), cy.end()); int ret = 1e9; for (int i = 0, j = 0; i < (int) x.size() && j < (int) y.size(); ) { if (cx[i] <= cy[j]) { ret = min(ret, cy[j] - cx[i++]); } else { ret = min(ret, cx[i] - cy[j++]); } } return ret; } int question(int x, int y, int v) { if (x == y) { return 0; } int idx = upper_bound(chng[x].begin(), chng[x].end(), v) - chng[x].begin() - 1; int idy = upper_bound(chng[y].begin(), chng[y].end(), v) - chng[y].begin() - 1; int kx = idx - (idx % S), ky = idy - (idy % S); assert(kx / S < (int) st[x].size()); assert(ky / S < (int) st[y].size()); auto sx = st[x][kx / S], sy = st[y][ky / S]; assert(idx < (int) chng[x].size()); assert(idy < (int) chng[y].size()); for (int i = kx + 1; i <= idx; ++i) { int ind = chng[x][i]; int o = a[ind] ^ b[ind] ^ x; edit(sx, o); } //assert(sx == f[x]); for (int i = ky + 1; i <= idy; ++i) { int ind = chng[y][i]; int o = a[ind] ^ b[ind] ^ y; edit(sy, o); } //assert(sy == f[y]); return get(sx, sy); }
#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...