Submission #884865

#TimeUsernameProblemLanguageResultExecution timeMemory
884865vjudge1Split the sequence (APIO14_sequence)C++17
100 / 100
1058 ms83500 KiB
#include <bits/stdc++.h> #define fi first #define se second const int N = 1e5 + 5; const int K = 205; const int mod = 1e9 + 7; const int inf = 1e18 + 7; #define all(v) (v).begin(), (v).end() #define pii pair<long long, int> using namespace std; mt19937 rd(chrono::steady_clock::now().time_since_epoch().count()); int n, k, trace[K][N], a[N]; long long dp[2][N], f[N]; long long cost(int i, int j){ return (f[n] - f[j]) * (f[j] - f[i - 1]); } void solve(int l, int r, int u, int v, int j){ if(l > r) return; int mid = l + r >> 1; pii best = {-inf, -1}; for(int pos = u; pos <= min(mid, v); pos++){ best = max(best, {dp[j & 1 ^ 1][pos - 1] + cost(pos, mid), pos}); } dp[j & 1][mid] = best.fi; trace[j][mid] = best.se; if(best.se == -1) return; solve(l, mid - 1, u, best.se, j); solve(mid + 1, r, best.se, v, j); } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); if(ifstream("sequence.in")){ freopen("sequence.in", "r", stdin); freopen("sequence.out", "w", stdout); } cin >> n >> k; for(int i = 1; i <= n; i++){ cin >> a[i]; f[i] = f[i - 1] + a[i]; dp[0][i] = -inf; } for(int j = 1; j <= k; j++){ for(int i = 0; i <= n; i++) dp[j & 1][i] = -inf; solve(1, n - 1, 1, n - 1, j); } long long res = -1; int pos = -1; for(int i = 1; i < n; i++){ if(dp[k & 1][i] > res){ res = dp[k & 1][i]; pos = i; } } cout << res << '\n'; stack<int> split; for(; k; k--){ split.push(pos); pos = trace[k][pos] - 1; } while(split.size()){ cout << split.top() << ' '; split.pop(); } return 0; } // tuntun

Compilation message (stderr)

sequence.cpp:9:22: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
    9 | const int inf = 1e18 + 7;
      |                 ~~~~~^~~
sequence.cpp: In function 'void solve(int, int, int, int, int)':
sequence.cpp:27:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   27 |  int mid = l + r >> 1;
      |            ~~^~~
sequence.cpp:30:26: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
   30 |   best = max(best, {dp[j & 1 ^ 1][pos - 1] + cost(pos, mid), pos});
      |                        ~~^~~
sequence.cpp: In function 'int main()':
sequence.cpp:44:13: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   44 |      freopen("sequence.in", "r", stdin);
      |      ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
sequence.cpp:45:13: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   45 |      freopen("sequence.out", "w", stdout);
      |      ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...