Submission #239645

#TimeUsernameProblemLanguageResultExecution timeMemory
239645neihcr7jSplit the sequence (APIO14_sequence)C++14
50 / 100
179 ms2040 KiB
#include<bits/stdc++.h>

#define maxn 100005

using namespace std;
typedef long long ll;

int n, k;
ll a[maxn];


namespace sub1234{
  ll dp[maxn][203];

  void trace(int i, int ik) {
    if (ik == 1) return;

    for (int j = i - 1; j > 0; --j)
      if (dp[i][ik] == dp[j][ik - 1] + (a[i] - a[j]) * a[j]) {
        trace(j, ik - 1);
        cout << j << ' ';
        break;
      }
  }

  void run() {
    for (int i = 1; i <= n; ++i)
      for (int ik = 2; ik <= k + 1 && ik <= i; ++ik)
        for (int j = 1; j < i; ++j)
          dp[i][ik] = max(dp[i][ik], dp[j][ik - 1] + (a[i] - a[j]) * a[j]);

    cout << dp[n][k + 1] << '\n';
    trace(n, k + 1);
  }
}

namespace sub56{

  void xuli(int& i, int& j, int& k) {
    int l = j + 1, r = k - 1;

    while (l < r) {
      int mid = (l + r + 1) / 2;
      if (a[k] - a[mid] >= a[mid - 1] - a[i])
        l = mid;
      else
        r = mid - 1;
    }
    j = l;
  }

  void run() {
    vector < int > id(k + 1);
    for (int i = 0; i <= k; ++i)
      id[i] = i;
    id.push_back(n);

    while (1) {
      bool flag = 1;
      for (int i = 0; i < k; ++i)
      if (id[i + 2] - id[i + 1] > 1) {
        ll A = a[id[i + 1]] - a[id[i]], B = a[id[i + 2]] - a[id[i + 1] + 1];
        if (B <= A) continue;
        flag = 0;
        xuli(id[i], id[i + 1], id[i + 2]);
        break;
      }

      if (flag) break;
    }

    ll ans = 0;
    for (int i = 2; i <= k + 1; ++i)
      ans +=  (a[id[i]] - a[id[i - 1]]) * a[id[i - 1]];

    cout << ans << '\n';
    for (int i = 1; i <= k; ++i)
      cout << id[i] << ' ';
  }
}

int main(){
  #define TASK "ABC"
 // freopen(TASK".inp", "r", stdin); freopen(TASK".out", "w", stdout);
  ios_base::sync_with_stdio(0);

  cin >> n >> k;

  for (int i = 1; i <= n; ++i)
    cin >> a[i];

  for (int i = 1; i <= n; ++i)
      a[i] += a[i - 1];

  //sub56::run(); return 0;

  if (n <= 1000)
    sub1234::run();
  else
    sub56::run();

  return 0;
}
#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...