Submission #1358274

#TimeUsernameProblemLanguageResultExecution timeMemory
1358274jumpFeast (NOI19_feast)C++20
4 / 100
31 ms10008 KiB
#include <bits/stdc++.h>
#define int long long //edge case prob
int n,k;
int arr[300010];
int l[300010],r[300010];
int pref[300010];
std::vector<int> narr;
signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::cin >> n >> k;
  int currRange = 0;
  for(int i=0;i<n;i++)std::cin >> arr[i];
  for(int i=0;i<n;i++){
    if(arr[i]<=0)arr[i]=0;
    else break;
  }
  for(int i=n-1;i>=0;i--){
    if(arr[i]<=0)arr[i]=0;
    else break;
  }
  for(int i=0;i<n;i++){
    if(arr[i]!=0){
      if(narr.empty())narr.push_back(arr[i]);
      else if(arr[i]>0&&narr.back()>0)narr.back()+=arr[i];
      else if(arr[i]<0&&narr.back()<0)narr.back()+=arr[i];
      else narr.push_back(arr[i]);
    }
  }
  int range = 0;
  int sum = 0;
  std::priority_queue<std::pair<int,int>> neg;
  for(int i=0;i<narr.size();i++){
    if(narr[i]>0){
      sum+=narr[i];
      range+=1;
    }
    else{
      neg.push({narr[i],i});
    }
    l[i]=i,r[i]=i;
    if(i==0)pref[i]=narr[i];
    else pref[i+1]=pref[i-1+1]+narr[i];
    //std::cout << narr[i] << ' ';
  }
  while(range>k){
    int value = neg.top().first;
    int idx = neg.top().second;
    neg.pop();
    int rl = l[idx-1];
    int rr = r[idx+1];
    r[rl]=rr;
    l[rr]=rl;
    sum-=(std::max((int)0,pref[rr+1]-pref[idx+1]+pref[idx-1+1]-pref[rl-1+1]));
    sum+=(std::max((int)0,pref[rr+1]-pref[rl-1+1]));
    range-=1;
  }
  std::cout << sum;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...