제출 #537238

#제출 시각아이디문제언어결과실행 시간메모리
537238Leonardo_Paes수열 (APIO14_sequence)C++17
89 / 100
1756 ms85708 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<int,pii> pip; #define f first #define s second const int maxn = 1e5+10, maxk = 210; ll dp[maxn][2], v[maxn], suf[maxn]; int opt[maxn][maxk]; void solve(int l, int r, int optl, int optr, int k){ if(l > r) return; int mid = (l + r) >> 1; dp[mid][1] = 0; for(int i=optl; i<=min(mid-1, optr); i++){ ll c = dp[i][0] + (suf[i+1] - suf[mid+1]) * suf[mid+1]; if(c > dp[mid][1]){ dp[mid][1] = c; opt[mid][k] = i; } } solve(l, mid-1, optl, opt[mid][k], k); solve(mid+1, r, opt[mid][k], optr, k); } int main(){ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); int n, k; cin >> n >> k; for(int i=1; i<=n; i++) cin >> v[i]; for(int i=n; i>=1; i--) suf[i] = v[i] + suf[i+1]; for(int i=1; i<n; i++) dp[i][0] = (suf[1] - suf[i+1]) * suf[i+1]; for(int i=2; i<=k; i++){ solve(1, n-1, 1, n-1, i); for(int j=1; j<=n; j++) dp[j][0] = dp[j][1]; } int id = 1; for(int i=2; i<n; i++) if(dp[i][0] > dp[id][0]) id = i; cout << dp[id][0] << "\n"; vector<int> ans; for(int i=1; i<=k; i++){ ans.push_back(id); id = opt[id][k-i+1]; } for(int i=ans.size()-1; i>=0; i--) cout << ans[i] << " "; cout << "\n"; return 0; /* 7 3 4 1 3 4 0 2 3 */ }
#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...