제출 #1358723

#제출 시각아이디문제언어결과실행 시간메모리
1358723Johan수열 (APIO14_sequence)C++20
71 / 100
66 ms196608 KiB
#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
int n, k;
vector < long long > pr, a;
vector < vector < int > > par;
vector < vector < long long > > dp;
long long get(int l, int r){
  return (pr[r] - pr[l]) * (pr[n] - pr[r]);
}
void f(int k, int l, int r, int optl, int optr){
  if(l > r)return;
  int mid = (l + r) >> 1;
  pair < long long , int > best = {-INF, -1};
  for(int i = optl; i <= min(mid - 1, optr); i++){
    long long cost = dp[i][k - 1] + get(i, mid);
    best = max(best, {cost, i});
  }
  dp[mid][k] = best.first;
  int opt = best.second;
  par[mid][k] = opt;
  f(k, l, mid - 1, optl, opt);
  f(k, mid + 1, r, opt, optr);  
}
signed main(){
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> k;
  a.assign(n + 1, 0ll);
  pr.assign(n + 1, 0ll);
  par.assign(n + 1, vector < int > (k + 1, 0));
  dp.assign(n + 1, vector < long long > (k + 1, -INF));
  for(int i = 1; i <= n; i++){
    cin >> a[i];
    pr[i] = pr[i - 1] + a[i];
  }
  dp[0][0] = 0;
  for(int i = 1; i <= k; i++)
    f(i, 1, n, 0, n - 1);
  long long mx = -INF, id = -1;
  for(int i = 1; i <= n; i++){
    if(mx < dp[i][k]){
      mx = dp[i][k];
      id = i;
    }
  }
  cout << mx << "\n";
  set < int > ans;
  while(id != 0){
    ans.insert(id);
    id = par[id][k--];
  }
  for(int i : ans)
    cout << i << ' ';
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…