This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#define ll long long
#define pll pair<ll, ll>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ld long double
#define sz(a) ((ll)(a).size())
using namespace std;
const ll maxn=200005;
ll a[maxn], pre[2][maxn];
set <pll> range, profit;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
ll n; cin >> n;
for (ll i=1; i<=n; i++)
{
cin >> a[i];
pre[i&1][i]=pre[i&1][i-1]+a[i];
pre[i&1^1][i]=pre[i&1^1][i-1]-a[i];
}
pre[0][n+1]=pre[0][n], pre[1][n+1]=pre[1][n];
// calculate range sum, index l and r are chosen
auto sum=[&](ll l, ll r)
{
assert((r-l)%2==0); l--, r++;
return pre[r&1][r]-(l?pre[r&1][l-1]:0);
};
for (ll i=1; i<=n; i++) profit.insert({a[i], i});
ll ans=0;
for (ll i=1; i<=(n+1)/2; i++)
{
auto [x, p]=*prev(profit.end()); profit.erase(prev(profit.end())), ans+=x, cout << ans << "\n";
auto ptr=range.lower_bound(mp(p, 0));
ll l=p, r=p;
if (ptr!=range.end() && (*ptr).fi==p+1)
r=(*ptr).se+1, ptr=range.erase(ptr);
if (ptr!=range.end() && (*ptr).fi==r+2)
r=(*ptr).se, r<n?profit.erase({sum((*ptr).fi, (*ptr).se), (*ptr).fi-1}),0:0, ptr=range.erase(ptr);
else if (r+1<=n) profit.erase({a[r+1], r+1});
if (ptr!=range.begin() && (*prev(ptr)).se==l-2)
l=(*prev(ptr)).fi, l>1?profit.erase({sum((*prev(ptr)).fi, (*prev(ptr)).se), l-1}),0:0, range.erase(prev(ptr));
else if (l-1>=1) profit.erase({a[l-1], l-1});
if (l>1 && r<n) profit.insert({sum(l, r), l-1});
range.insert({l, r});
}
}
Compilation message (stderr)
candies.cpp: In function 'int main()':
candies.cpp:25:14: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
25 | pre[i&1^1][i]=pre[i&1^1][i-1]-a[i];
| ~^~
candies.cpp:25:28: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
25 | pre[i&1^1][i]=pre[i&1^1][i-1]-a[i];
| ~^~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |