Submission #988679

#TimeUsernameProblemLanguageResultExecution timeMemory
988679gggkikFeast (NOI19_feast)C++14
41 / 100
86 ms20932 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int MXN = 1e6+5; ll A[MXN]; int L[MXN], R[MXN]; void era(int x){ int l = L[x], r = R[x]; R[l] = r; L[r] = l; } int main() { cin.tie(0)->sync_with_stdio(0); int n, k; cin >> n >> k; for(int i = 1;i<=n;i++) { cin >> A[i]; if(i>1 && A[i]*A[i-1]>=0) A[i-1] += A[i], i--, n--; else if(i==1 && A[i]<=0) i--,n--; } if(n && A[n]<=0) n--; for(int i = 1;i<=n;i++) L[i] = i-1, R[i] = i+1; L[1] = -1, R[n] = -1; ll ans = 0; int cnt = 0; for(int i = 1;i<=n;i++) { if(A[i]>0) cnt++; ans += max(0LL,A[i]); A[i] = -abs(A[i]); } k = cnt-k; priority_queue<pair<ll,int>> pq, rem; for(int i = 1;i<=n;i++) pq.push({A[i],i}); for(int i = 0;i<k;i++){ while(pq.size() && rem.size() && pq.top()==rem.top()) pq.pop(), rem.pop(); int p = pq.top().second; pq.pop(); ans += A[p]; int l = L[p], r = R[p]; if(l!=-1 && r!=-1) { A[p] = A[l]+A[r]-A[p]; pq.push({A[p],p}); } else era(p); if(l!=-1) era(l), rem.push({A[l],l}); if(r!=-1) era(r), rem.push({A[r],r}); } cout << 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...