Submission #1086420

#TimeUsernameProblemLanguageResultExecution timeMemory
1086420steveonalexCandies (JOI18_candies)C++17
100 / 100
447 ms32084 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; #define MASK(i) (1LL << (i)) #define GETBIT(mask, i) (((mask) >> (i)) & 1) #define ALL(v) (v).begin(), (v).end() #define block_of_code if(true) ll max(ll a, ll b){return (a > b) ? a : b;} ll min(ll a, ll b){return (a < b) ? a : b;} ll gcd(ll a, ll b){return __gcd(a, b);} ll lcm(ll a, ll b){return a / gcd(a, b) * b;} ll LASTBIT(ll mask){return (mask) & (-mask);} int pop_cnt(ll mask){return __builtin_popcountll(mask);} int ctz(ull mask){return __builtin_ctzll(mask);} int logOf(ull mask){return 63 - __builtin_clzll(mask);} mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);} double rngesus_d(double l, double r){ double cur = rngesus(0, MASK(60) - 1); cur /= MASK(60) - 1; return l + cur * (r - l); } template <class T1, class T2> bool maximize(T1 &a, T2 b){ if (a < b) {a = b; return true;} return false; } template <class T1, class T2> bool minimize(T1 &a, T2 b){ if (a > b) {a = b; return true;} return false; } template <class T> void printArr(T container, string separator = " ", string finish = "\n", ostream &out = cout){ for(auto item: container) out << item << separator; out << finish; } template <class T> void remove_dup(vector<T> &a){ sort(ALL(a)); a.resize(unique(ALL(a)) - a.begin()); } const ll INF = 1e18 + 69; const int N = 2e5 + 69; ll a[N], pref[N]; int main(void){ ios::sync_with_stdio(0);cin.tie(0); cout.tie(0); clock_t start = clock(); int n; cin >> n; a[1] = a[n+2] = -INF; for(int i = 2; i<=n+1; ++i) cin >> a[i]; for(int i = 1; i<=n+2; ++i) pref[i] = pref[i-1] + a[i]; set<array<ll, 3>> S1, S2; // S1 sort by range, S2 sort by value for(int i = 1; i<=n+2; ++i){ S1.insert({{i, i, a[i]}}); S2.insert({{a[i], i, i}}); } ll ans = 0; for(int iteration = 1; iteration <= (n + 1) / 2; ++iteration){ array<ll, 3> cur = *S2.rbegin(); ans += cur[0]; array<ll, 3> _cur = {cur[1], cur[2], cur[0]}; S1.erase(_cur); S2.erase(cur); // cout << _cur[0]-1 << " " << _cur[1]-1 << " " << _cur[2] << "\n"; auto it = S1.lower_bound(_cur); array<ll, 3> R = *it; it--; array<ll, 3> L = *it; S1.erase(L); S1.erase(R); S2.erase({{L[2], L[0], L[1]}}); S2.erase({{R[2], R[0], R[1]}}); _cur = {L[0], R[1], L[2] + R[2] - _cur[2]}; S1.insert(_cur); S2.insert({{_cur[2], _cur[0], _cur[1]}}); // cout << _cur[0]-1 << " " << _cur[1]-1 << " " << _cur[2] << "\n"; cout << ans << "\n"; } cerr << "Time elapsed: " << clock() - start << " ms\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...