Submission #799273

#TimeUsernameProblemLanguageResultExecution timeMemory
799273NeroZeinThe Potion of Great Power (CEOI20_potion)C++17
17 / 100
336 ms44628 KiB
#include "bits/stdc++.h" using namespace std; const int C = 50; const int N = 1e5 + 5; const int U = 2e5 + 5; const int INF = 1e9; int h[N]; struct cmp { bool operator ()(int i, int j) const { return h[i] < h[j]; } }; void print (int u, set<int, cmp> se) { cout << "U: " << u << '\n'; cout << "SE: "; for (int i : se) cout << i << ' '; cout << '\n'; } int a[U], b[U]; set<int, cmp> cur[N]; vector<int> edits[N]; vector<set<int, cmp>> versions[N]; void edit (int v, set<int, cmp>& seU) { if (seU.count(v)) { seU.erase(v); } else { seU.insert(v); } } void init (int N_, int D, int H[]) { for (int i = 0; i < N_; ++i) { edits[i].push_back(0); versions[i].push_back({}); h[i] = H[i]; } } void curseChanges (int U_, int A[], int B[]) { for (int day = 1; day <= U_; ++day) { a[day] = A[day - 1]; b[day] = B[day - 1]; edit(b[day], cur[a[day]]); edit(a[day], cur[b[day]]); edits[a[day]].push_back(day); edits[b[day]].push_back(day); if (edits[a[day]].size() % C == 0) { versions[a[day]].push_back(cur[a[day]]); } if (edits[b[day]].size() % C == 0) { versions[b[day]].push_back(cur[a[day]]); } } } int getDis (vector<int> h1, vector<int> h2) {//n + m if (h1.empty() || h2.empty()) { return INF; } assert(is_sorted(h1.begin(), h1.end())); assert(is_sorted(h2.begin(), h2.end())); 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, h2[j] - h1[i]); } i++; } else { if (i < n) { ret = min(ret, h1[i] - h2[j]); } j++; } } return ret; } int question (int x, int y, int v) { vector<int> vv[2] = {}; vector<set<int, cmp>> se(2); for (int rep = 0; rep < 2; ++rep) { int last_edit = upper_bound(edits[x].begin(), edits[x].end(), v) - edits[x].begin() - 1; se[rep] = versions[x][last_edit / C]; int st = last_edit - (last_edit % C) + 1; for (; st <= last_edit; ++st) { int i = a[edits[x][st]], j = b[edits[x][st]]; if (i != x) { assert(j == x); swap(i, j); } edit(j, se[rep]); } for (auto i : se[rep]) vv[rep].push_back(h[i]); swap(x, y); } return getDis(vv[0], vv[1]); }
#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...