Submission #1218201

#TimeUsernameProblemLanguageResultExecution timeMemory
1218201__moin__The Potion of Great Power (CEOI20_potion)C++20
38 / 100
1016 ms327680 KiB
#include <bits/stdc++.h> // #include "grader.cpp" using namespace std; struct segtree_arr { int n; vector<int> vals; vector<int> left; vector<int> right; segtree_arr() { } segtree_arr(int N, int def) { n = N; n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; n++; vals.resize(2*n, -1); left.resize(2*n, -1); right.resize(2*n, -1); for (int i = 0; i < N; i++) { vals[n+i] = def; } for (int i = n-1; i >= 1; i--) { left[i] = 2*i; right[i] = 2*i+1; } } int add_node(int v, int l, int r) { vals.push_back(v); left.push_back(l); right.push_back(r); return vals.size()-1; } int set(int idx, int x, int l, int r, int i) { if (l + 1 == r) { return add_node(x, -1, -1); } int m = (l+r)/2; if (idx < m) { return add_node(-1, set(idx, x, l, m, left[i]), right[i]); } else { return add_node(-1, left[i], set(idx, x, m, r, right[i])); } } int get(int idx, int l, int r, int i) { if (l+1 == r) return vals[i]; int m = (l+r)/2; if (idx < m) return get(idx, l, m, left[i]); else return get(idx, m, r, right[i]); } }; vector<int> heights; struct cmp { bool operator()(int x, int y) const { if (heights[x] == heights[y]) return x < y; return heights[x] < heights[y]; } }; vector<set<int,cmp>> adj_sets; segtree_arr adj; vector<int> v_roots; void init(int N, int D, int H[]) { adj_sets.push_back({}); adj = segtree_arr(N, 0); v_roots.push_back(1); heights.resize(N); for (int i = 0; i < N; i++) heights[i] = H[i]; } void curseChanges(int U, int A[], int B[]) { for (int i = 0; i < U; i++) { int a = A[i], b = B[i];// a--; b--; set<int,cmp> sa = adj_sets[adj.get(a, 0, adj.n, v_roots.back())]; set<int,cmp> sb = adj_sets[adj.get(b, 0, adj.n, v_roots.back())]; if (sa.find(b) == sa.end()) { sa.insert(b); sb.insert(a); } else { sa.erase(b); sb.erase(a); } adj_sets.push_back(sa); adj_sets.push_back(sb); int tmp_root = adj.set(a, adj_sets.size()-2, 0, adj.n, v_roots.back()); int new_root = adj.set(b, adj_sets.size()-1, 0, adj.n, tmp_root); v_roots.push_back(new_root); } } int question(int x, int y, int v) { // cerr << "X = " << x << ", Y = " << y << ", V = " << v << "\n"; set<int,cmp> sx = adj_sets[adj.get(x, 0, adj.n, v_roots[v])]; set<int,cmp> sy = adj_sets[adj.get(y, 0, adj.n, v_roots[v])]; int min_diff = 1e9; for (int a : sx) { auto tmp = sy.lower_bound(a); if (tmp != sy.end()) min_diff = min(min_diff, abs(heights[a] - heights[*tmp])); if (tmp != sy.begin()) min_diff = min(min_diff, abs(heights[a] - heights[*(--tmp)])); // for (int b : sy) min_diff = min(min_diff, abs(heights[a] - heights[b])); } return min_diff; }
#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...