Submission #1332571

#TimeUsernameProblemLanguageResultExecution timeMemory
1332571DeltaStructHoliday (IOI14_holiday)C++20
100 / 100
1152 ms5820 KiB
#include <bits/stdc++.h>
using namespace std;
#include "holiday.h"

struct range_sum {
  int l,r,s,m; long long res; vector<int>& A; multiset<int,greater<int>> B,C;
  long long mv(){
    int d = max(0,m-(s-l)-(r-l));
    while(!C.empty()&&B.size()<d) res += *C.begin(),B.emplace(*C.begin()),C.erase(C.begin());
    while(B.size()>d) res -= *B.rbegin(),C.emplace(*B.rbegin()),B.erase(prev(B.end()));
    while(!B.empty()&&!C.empty()&&*B.rbegin()<*C.begin()){
      res += *C.begin(),B.emplace(*C.begin()),C.erase(C.begin());
      res -= *B.rbegin(),C.emplace(*B.rbegin()),B.erase(prev(B.end()));
    }
    return res;
  }
  range_sum(vector<int>& D,int t,int d) : l(0),r(0),s(t),m(d),res(0),A(D),B(),C() {
    C.emplace(A[0]),mv();
  }
  long long increase_right(){
    C.emplace(A[++r]);
    return mv();
  }
  long long decrease_left(){
    C.emplace(A[--l]);
    return mv();
  }
  long long del(int x){
    if (!B.empty()&&*B.rbegin()<=x) res -= x,B.erase(B.find(x));
    else C.erase(C.find(x));
    return mv();
  }
  long long decrease_right(){
    return del(A[r--]);
  }
  long long increase_left(){
    return del(A[l++]);
  }
  long long set(int x,int y){
    while(r<y) increase_right();
    while(l>x) decrease_left();
    while(r>y) decrease_right();
    while(l<x) increase_left();
    return res;
  }
};

long long findMaxAttraction(int n,int start,int m,int AA[]){
  vector<int> A(AA,AA+n);
  auto dp = [&](auto& dp,range_sum& B,int a,int b,int c,int d) -> long long {
    int mid = (a+c)/2;
    long long res(0); int ind(b);
    for (int i(b);i <= d;++i) if (res<B.set(mid,i)) res = B.res,ind = i;
    long long ret = res;
    if (a<mid) ret = max(ret,dp(dp,B,a,b,mid-1,ind));
    if (mid<c) ret = max(ret,dp(dp,B,mid+1,ind,c,d));
    return ret;
  };
  auto solve = [&]() -> long long {
    range_sum B(A,start,m);
    return dp(dp,B,0,start,start,n-1);
  };
  long long res = solve();
  reverse(A.begin(),A.end()),start = n-start-1;
  return max(res,solve());
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...