Submission #1188054

#TimeUsernameProblemLanguageResultExecution timeMemory
1188054versesrevSplit the sequence (APIO14_sequence)C++20
Compilation error
0 ms0 KiB
#include <iostream>
#include <vector>
#include <limits>
#include <numeric>
#include <algorithm>

int main() {
  int n, k;
  std::cin >> n >> k;
  std::vector<int> xs(n);
  for (int& x : xs) std::cin >> x;
  
  std::vector<long long> sum(n);
  std::partial_sum(xs.begin(), xs.end(), sum.begin());
  
  long long INF = std::numeric_limits<long long>::max();
  std::vector<std::vector<long long>> dp(2, std::vector<long long>(n, INF));
  std::vector<std::vector<int>> back(k+1, std::vector<int>(n, -1));
  for (int i = 0; i < n; ++i) {
    dp[0][i] = sum[i] * sum[i];
    back[0][i] = -1;
  }
  for (int ik = 1, cur = 1; ik <= k; ++ik, cur ^= 1) {
    //for (int i = 0; i < n; ++i) {
    auto go = (auto&& self, int il, int ir, int jl, int jr) -> void {
      int i = std::mid(il, ir);
      dp[cur][i] = INF;
      for (int j = std::max(ik, jl); j <= jr; ++j) {
        long long r = sum[i] - sum[j-1];
        long long v2 = sum[j-1]*sum[j-1]/ik + r*r;
        if (r*(ik+1) < sum[i] and v2 >= dp[cur][i]) break;
        long long v = dp[cur^1][j-1] + r*r;
        if (dp[cur][i] >= v) {
          dp[cur][i] = v;
          back[ik][i] = j - 1;
        }
      }
      if (il < i) self(self, il, i-1, jl, back[ik][i]);
      if (i < ir) self(self, ir+1, ir, back[ik][i], jr);
    };
    go(go, 0, n-1, 0, n-1);
  }
  std::vector<int> ans;
  for (int p = n - 1, ik = k; ik; --ik) {
    p = back[ik][p];
    ans.push_back(p + 1);
  }
  std::ranges::reverse(ans);
  std::cout << ((sum[n-1] * sum[n-1] - dp[k&1][n-1]) / 2) << "\n";
  for (int v : ans) std::cout << v << " ";
  std::cout << "\n";
}

Compilation message (stderr)

sequence.cpp: In function 'int main()':
sequence.cpp:25:16: error: expected primary-expression before 'auto'
   25 |     auto go = (auto&& self, int il, int ir, int jl, int jr) -> void {
      |                ^~~~
sequence.cpp:25:16: error: expected ')' before 'auto'
   25 |     auto go = (auto&& self, int il, int ir, int jl, int jr) -> void {
      |               ~^~~~
      |                )