Submission #1304883

#TimeUsernameProblemLanguageResultExecution timeMemory
1304883TymondCandies (JOI18_candies)C++20
100 / 100
279 ms21512 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; #define fi first #define se second #define vi vector<int> #define vll vector<long long> #define pii pair<int, int> #define pll pair<long long, long long> #define pb push_back #define mp make_pair #define eb emplace_back #define all(x) (x).begin(), (x).end() #define sz(x) (int)(x).size() mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); mt19937_64 rng64(chrono::high_resolution_clock::now().time_since_epoch().count()); inline int rand(int l,int r){return uniform_int_distribution<int>(l, r)(rng);} inline ll rand(ll l,ll r){return uniform_int_distribution<ll>(l, r)(rng64);} #ifdef DEBUG auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif struct custom_hash { static uint64_t splitmix64(uint64_t x) { x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31); } size_t operator()(uint64_t x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x + FIXED_RANDOM); } }; const ll INF = 1e18; const int MAXN = 2e5 + 7; const int MAXK = 19; ll pref[MAXN]; ll A[MAXN]; ll ans[MAXN]; pii interval[MAXN]; ll adding[MAXN]; int rep[MAXN]; int n; set<pair<ll, int>> S; ll Curr; int Find(int a){ if(rep[a] == a){ return a; } return rep[a] = Find(rep[a]); } ll getSum(int l, int p){ return (ll)pref[p] - (l - 2 >= 0 ? pref[l - 2] : 0LL); } void preprocessing(){ for(int i = 1; i <= n; i++){ pref[i] = (ll)A[i] + (i - 2 >= 0 ? pref[i - 2] : 0LL); } } void add(int ind){ //ind jest zapalany // cerr << "====== " << ind << '\n'; // debug(interval[ind]); // debug(interval[ind - 1]); // debug(interval[ind + 1]); if(interval[ind + 1] == mp(-1, -1)){ //nowy przedział interval[ind] = mp(ind, ind); }else{ //rozszerzasz przedział z ind + 1 interval[ind] = mp(ind, interval[ind + 1].se + 1); rep[ind + 1] = ind; rep[interval[ind + 1].se + 1] = ind; interval[ind + 1] = mp(-1, -1); } int r = interval[ind].se; if(ind - 1 > 0 && S.find(mp(adding[ind - 1], ind - 1)) != S.end()){ S.erase(mp(adding[ind - 1], ind - 1)); } if(r + 1 <= n && S.find(mp(adding[r + 1], r + 1)) != S.end()){ S.erase(mp(adding[r + 1], r + 1)); } if(r + 2 <= n && interval[r + 2] != mp(-1, -1)){ rep[r + 2] = ind; r = interval[r + 2].se; interval[r + 2] = mp(-1, -1); interval[ind].se = r; } if(ind - 2 > 0 && interval[Find(ind - 2)] != mp(-1, -1)){ rep[ind] = interval[Find(ind - 2)].fi; int nind = Find(ind); interval[nind].se = interval[ind].se; interval[ind] = mp(-1, -1); ind = nind; } //cerr << ind << ' ' << interval[ind].se << '\n'; if(ind - 1 > 0){ if(S.find(mp(adding[ind - 1], ind - 1)) != S.end()){ S.erase(mp(adding[ind - 1], ind - 1)); } if(interval[ind].se + 1 > n){ return; } adding[ind - 1] = (ll)getSum(ind - 1, interval[ind].se + 1) - getSum(ind, interval[ind].se); // cerr << "ADD: " << ind - 1 << ' ' << adding[ind - 1] << '\n'; S.insert(mp(adding[ind - 1], ind - 1)); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); cin >> n; interval[0] = interval[n + 1] = mp(-1, -1); for(int i = 1; i <= n; i++){ cin >> A[i]; S.insert(mp(A[i], i)); interval[i] = mp(-1, -1); adding[i] = A[i]; rep[i] = i; } preprocessing(); Curr = 0LL; for(int i = 1; i <= (n + 1) / 2; i++){ pair<ll, int> curr = *(--S.end()); S.erase(--S.end()); //cerr << curr.fi << ' ' << curr.se << '\n'; Curr += curr.fi; add(curr.se); cout << Curr << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...