Submission #710029

#TimeUsernameProblemLanguageResultExecution timeMemory
710029PixelCatReconstruction Project (JOI22_reconstruction)C++14
0 / 100
496 ms35712 KiB
#include <bits/stdc++.h> #define For(i, a, b) for(int i = a; i <= b; i++) #define Forr(i, a, b) for(int i = a; i >= b; i--) #define F first #define S second #define all(x) x.begin(), x.end() #define sz(x) ((int)x.size()) #define eb emplace_back #define int LL using namespace std; using LL = long long; using pii = pair<int, int>; mt19937_64 rng(48763); struct Treap { Treap *l, *r; int pri; int key, size, sum; Treap(int _k) { l = r = nullptr; pri = rng(); key = sum = _k; size = 1; } }; int size(Treap *&rt) { if(rt) return rt->size; return 0; } int sum(Treap *&rt) { if(rt) return rt->sum; return 0; } void pull(Treap *&rt) { rt->size = size(rt->l) + size(rt->r) + 1; rt->sum = sum(rt->l) + sum(rt->r) + rt->key; } Treap* merge(Treap *a, Treap *b) { if(!a) return b; if(!b) return a; if(a->pri > b->pri) { a->r = merge(a->r, b); pull(a); return a; } else { b->l = merge(a, b->l); pull(b); return b; } } // a: key <= k void split_key(Treap *rt, Treap *&a, Treap *&b, int k) { if(!rt) { a = b = nullptr; return; } if(rt->key <= k) { a = rt; split_key(rt->r, a->r, b, k); pull(a); } else { b = rt; split_key(rt->l, a, b->l, k); pull(b); } } // a: size = k void split_size(Treap *rt, Treap *&a, Treap *&b, int k) { if(!rt) { a = b = nullptr; return; } if(size(rt->l) + 1 <= k) { a = rt; split_key(rt->r, a->r, b, k - size(rt->l) - 1); pull(a); } else { b = rt; split_key(rt->l, a, b->l, k); pull(b); } } void insert(Treap *&rt, int x) { Treap *a, *b; split_key(rt, a, b, x); rt = merge(a, merge(new Treap(x), b)); } void erase(Treap *&rt, int x) { Treap *a, *b, *c; split_key(rt, a, b, x - 1); split_size(b, b, c, 1); delete b; rt = merge(a, c); } int eval(Treap *&rt, int x) { Treap *a, *b; split_key(rt, a, b, x); int res = x * (size(a) - size(b)) - sum(a) + sum(b); rt = merge(a, b); return res; } const int MAXN = 510; vector<int> v[MAXN]; int32_t main() { ios::sync_with_stdio(false); cin.tie(0); // =^-w-^= int n, m; cin >> n >> m; For(i, 1, m) { int a, b, w; cin >> a >> b >> w; assert(b == a + 1); v[a].eb(w); } vector<pair<int, pii>> ev; // {time, {old, new}} Treap *rt = nullptr; For(i, 1, n - 1) { sort(all(v[i])); insert(rt, v[i][0]); For(j, 1, sz(v[i]) - 1) { int a = v[i][j - 1]; int b = v[i][j]; int mi = b - ((b - a) / 2); ev.eb(mi, pii(a, b)); } } sort(all(ev)); reverse(all(ev)); int q; cin >> q; while(q--) { int x; cin >> x; while(sz(ev) && ev.back().F <= x) { auto p = ev.back().S; erase(rt, p.F); insert(rt, p.S); ev.pop_back(); } cout << eval(rt, x) << "\n"; } return 0; }
#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...