Submission #102832

#TimeUsernameProblemLanguageResultExecution timeMemory
102832wxh010910Holiday (IOI14_holiday)C++17
24 / 100
135 ms66560 KiB
#include <bits/stdc++.h> #include "holiday.h" using namespace std; class node { public: node* l; node* r; int cnt; long long sum; }; node* insert(node* u, int l, int r, int p, int w) { node* v = new node(); v->l = u->l; v->r = u->r; v->cnt = u->cnt + 1; v->sum = u->sum + w; if (l != r) { int y = (l + r) >> 1; if (p <= y) { v->l = insert(u->l, l, y, p, w); } else { v->r = insert(u->r, y + 1, r, p, w); } } return v; } long long query(node* v, node* u, int l, int r, int k) { if (l == r) { return v->sum - u->sum; } else { int y = (l + r) >> 1; if (v->r->cnt - u->r->cnt >= k) { return query(v->r, u->r, y + 1, r, k); } else { return query(v->l, u->l, l, y, k - (v->r->cnt - u->r->cnt)) + (v->r->sum - u->r->sum); } } } long long findMaxAttraction(int n, int start, int d, int attraction[]) { node* null = new node(); null->l = null->r = null; null->cnt = null->sum = 0; vector<int> order(n); for (int i = 0; i < n; ++i) { order[i] = i; } sort(order.begin(), order.end(), [&](int a, int b) { return attraction[a] < attraction[b]; }); vector<int> pos_in_order(n); for (int i = 0; i < n; ++i) { pos_in_order[order[i]] = i; } vector<node*> roots(n + 1, null); for (int i = 0; i < n; ++i) { roots[i + 1] = insert(roots[i], 0, n - 1, pos_in_order[i], attraction[i]); } long long ans = 0; function<void(int, int, int, int)> solve = [&](int l, int r, int ll, int rr) { if (l > r) { return; } int mid = (l + r) >> 1, pos = -1; long long best = -1; for (int i = ll; i <= rr; ++i) { int cnt = d - (i - mid) - min(i - start, start - mid); if (cnt < 0) { break; } long long value = (i - mid + 1 <= cnt ? roots[i + 1]->sum - roots[mid]->sum : query(roots[i + 1], roots[mid], 0, n - 1, cnt)); if (best < value) { best = value; pos = i; } } ans = max(ans, best); solve(l, mid - 1, ll, pos); solve(mid + 1, r, pos, rr); }; solve(max(0, start - d + 1), start, start, min(n - 1, start + d - 1)); return ans; }

Compilation message (stderr)

grader.cpp: In function 'int main()':
grader.cpp:7:12: warning: variable 'n_s' set but not used [-Wunused-but-set-variable]
     int i, n_s;
            ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...