Submission #126957

#TimeUsernameProblemLanguageResultExecution timeMemory
126957AQTSplit the sequence (APIO14_sequence)C++14
22 / 100
1338 ms31224 KiB
#include <bits/stdc++.h> using namespace std; int N, K; long long pre[100005]; long long dp[100005][25]; int par[100005][25]; deque<int>dq; double f(int idx1, int idx2, int lvl){ return (dp[idx1][lvl]-dp[idx2][lvl]-pre[idx1]*pre[idx1]+pre[idx2]*pre[idx2]); } int main(){ cin.sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N >> K; for(int i = 1; i<=N; i++){ cin >> pre[i]; pre[i] += pre[i-1]; } for(int k = 1; k<=K; k++){ dq.push_back(k); for(int i = k+1; i<=N; i++){ while(dq.size() >= 2){ if(f(dq[0], dq[1], k-1) <= pre[i]*(pre[dq[1]]-pre[dq[0]])){ dq.pop_front(); } else{ break; } } dp[i][k] = dp[dq.front()][k-1] + pre[dq.front()]*(pre[i]-pre[dq.front()]); par[i][k] = dq.front(); //cout << i << " " << k << " " << dp[i][k] << " " << par[i][k] << endl; while(dq.size() >= 2){ if(f(dq[dq.size()-2], dq[dq.size()-1], k-1)*(pre[i]-pre[dq.back()]) >= f(dq.back(), i, k-1)*(pre[dq[dq.size()-1]]-pre[dq[dq.size()-2]])){ dq.pop_back(); } else{ break; } } dq.push_back(i); } dq.clear(); } cout << dp[N][K] << "\n"; int crnt = N; for(int k = K; k>=1; k--){ cout << par[crnt][k] << " "; crnt = par[crnt][k]; } cout << "\n"; }
#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...