Submission #208281

#TimeUsernameProblemLanguageResultExecution timeMemory
208281SortingHoliday (IOI14_holiday)C++14
0 / 100
5074 ms6136 KiB
#include"holiday.h" #include <bits/stdc++.h> using namespace std; const int kN = 1e5 + 7; pair<long long, int> nodes[4 * kN]; vector<pair<int, int>> order; pair<long long, int> merge(pair<long long, int> a, pair<long long, int> b){ pair<long long, int> ret; ret.first = a.first + b.first; ret.second = a.second + b.second; return ret; } void update(int idx, int l, int r, int s, int val){ if(s < l || r < s) return; if(l == r){ nodes[idx].second = val; nodes[idx].first = order[l].first * nodes[idx].second; return; } int mid = (l + r) >> 1; update(2 * idx, l, mid, s, val); update(2 * idx + 1, mid + 1, r, s, val); nodes[idx] = merge(nodes[2 * idx], nodes[2 * idx + 1]); } pair<long long, int> query(int idx, int l, int r, int cnt){ if(!cnt) return {0, 0}; if(nodes[idx].second <= cnt) return nodes[idx]; int mid = (l + r) >> 1; pair<long long, int> a = query(2 * idx, l, mid, cnt); pair<long long, int> b = query(2 * idx + 1, mid + 1, r, cnt - a.second); return merge(a, b); } long long findMaxAttraction(int n, int start, int d, int attraction[]){ order.resize(n); for(int i = 0; i < n; ++i) order[i] = {attraction[i], i}; sort(order.begin(), order.end()); vector<int> idx(n); for(int i = 0; i < n; ++i) idx[order[i].second] = i; long long ans = 0; for(int i = start; i >= 0; --i){ update(1, 0, n - 1, i, 1); for(int j = start + 1; j < n; ++j) update(1, 0, n - 1, j, 0); for(int j = start; j < n; ++j){ update(1, 0, n - 1, j, 1); int dist = min(start - i, j - start) * 2 + max(start - i, j - start); if(dist > d) break; ans = max(query(1, 0, n - 1, d - dist).first, ans); } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...