Advertisement
arujbansal

Untitled

Apr 22nd, 2021
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <map>
  5. #include <set>
  6. #include <array>
  7. #include <stack>
  8. #include <queue>
  9. #include <random>
  10. #include <numeric>
  11. #include <functional>
  12. #include <chrono>
  13. #include <utility>
  14. #include <iomanip>
  15. #include <assert.h>
  16.  
  17. using namespace std;
  18.  
  19. void dbg_out() { cerr << endl; }
  20. template<typename Head, typename... Tail>
  21. void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }
  22. #define dbg(...) cerr << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
  23.  
  24. #define rng_init mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
  25. #define rng_seed(x) mt19937 rng(x)
  26. #define all(x) (x).begin(), (x).end()
  27. #define sz(x) (int) (x).size()
  28. #define int long long
  29.  
  30. const int MXN = 1e5 + 5, INF = 1e18;
  31. int N, K;
  32. int A[MXN], dp[2][MXN], pref[MXN], trace[205][MXN];
  33.  
  34. void dnc(int l, int r, int i, int optl, int optr) {
  35.     if (l > r) return;
  36.  
  37.     int cur = i & 1;
  38.  
  39.     int mid = (l + r) / 2;
  40.     pair<int, int> best = {-INF, -INF};
  41.  
  42.     for (int j = optl; j < min(mid, optr + 1); j++) {
  43.         int new_val = dp[cur ^ 1][j] + (pref[mid] - pref[j]) * (pref[N] - pref[mid]);
  44.  
  45.         if (new_val > best.first)
  46.             best = make_pair(new_val, j);
  47.     }
  48.  
  49.     dp[cur][mid] = best.first;
  50.     trace[i][mid] = best.second;
  51.  
  52.     dnc(l, mid - 1, i, optl, best.second);
  53.     dnc(mid + 1, r, i, best.second, optr);
  54. }
  55.  
  56. void solve() {
  57.     cin >> N >> K;
  58.  
  59.     for (int i = 1; i <= N; i++) {
  60.         cin >> A[i];
  61.         pref[i] = pref[i - 1] + A[i];
  62.     }
  63.  
  64.     for (int i = 0; i < 2; i++)
  65.         for (int j = 0; j < MXN; j++)
  66.             dp[i][j] = -INF;
  67.  
  68.     dp[0][0] = 0;
  69.  
  70.     for (int i = 1; i <= K; i++)
  71.         dnc(i, N, i, i - 1, N - 1);
  72.  
  73.     pair<int, int> best = {-INF, -INF};
  74.     for (int j = 1; j <= N; j++)
  75.         best = max(best, make_pair(dp[K & 1][j], j));
  76.  
  77.     cout << best.first << "\n";
  78.  
  79.     int cur_k = K;
  80.     while (cur_k) {
  81.         cout << best.second << " ";
  82.         best.second = trace[cur_k--][best.second];
  83.     }
  84. }
  85.  
  86. signed main() {
  87.     ios_base::sync_with_stdio(false);
  88.     cin.tie(nullptr);
  89.  
  90.     int TC = 1;
  91.     // cin >> TC;
  92.     while (TC--) solve();
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement