Submission #710174

#TimeUsernameProblemLanguageResultExecution timeMemory
710174PixelCatReconstruction Project (JOI22_reconstruction)C++14
7 / 100
328 ms28708 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; } struct Nyan { int ssm, sbg; multiset<int> sm, bg; int last_qry; void init() { ssm = sbg = 0; sm.clear(); bg.clear(); last_qry = 0; } void insert(int x) { if(x <= last_qry) { sm.insert(x); ssm += x; } else { bg.insert(x); sbg += x; } } void erase(int x) { if(x <= last_qry) { sm.erase(sm.find(x)); ssm -= x; } else { bg.erase(bg.find(x)); sbg -= x; } } int eval(int x) { while(sz(bg) && (*bg.begin()) <= x) { int k = *bg.begin(); ssm += k; sbg -= k; sm.insert(k); bg.erase(bg.begin()); } last_qry = x; return x * (sz(sm) - sz(bg)) - ssm + sbg; } } owo; 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; owo.init(); For(i, 1, n - 1) { sort(all(v[i])); // insert(rt, v[i][0]); owo.insert(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); owo.erase(p.F); owo.insert(p.S); ev.pop_back(); } // cout << eval(rt, x) << "\n"; cout << owo.eval(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...