제출 #126932

#제출 시각아이디문제언어결과실행 시간메모리
126932AQT수열 (APIO14_sequence)C++14
33 / 100
125 ms131076 KiB
#include <bits/stdc++.h> using namespace std; struct line{ long long s, init, idx; }; int N, K; long long pre[100005]; long long dp[100005][205]; int par[100005][205]; deque<line>dq; 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({pre[k], -pre[k]*pre[k]+dp[k][k-1], k}); for(int i = k+1; i<=N; i++){ while(dq.size() >= 2){ if(dq[0].s*pre[i]+dq[0].init <= dq[1].s*pre[i]+dq[1].init){ dq.pop_front(); } else{ break; } } dp[i][k] = dq[0].s*pre[i]+dq[0].init; par[i][k] = dq[0].idx; //cout << i << " " << k << " " << dp[i][k] << " " << par[i][k] << endl; line l = {pre[i], -pre[i]*pre[i]+dp[i][k-1], i}; while(dq.size()){ if(dq.back().init < l.init){ dq.pop_back(); } else{ break; } } dq.push_back(l); } 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...