제출 #543223

#제출 시각아이디문제언어결과실행 시간메모리
543223fuad27수열 (APIO14_sequence)C++17
100 / 100
773 ms86152 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; const int N = 1000'10; vector<ll> dp[2]; ll pref[N]; ll arr[N]; int pre[N][210]; bool slope(ll a, ll b, ll c) { return (((dp[0][a] - dp[0][b])*(-pref[c]+pref[b])) >= ((dp[0][b] - dp[0][c])*(-pref[b] + pref[a]))); /* slope(cur, dq[0]) >= slope(dq[0], dq[1]) */ } ll val(ll idx, ll x) { return (-pref[idx]*x) + dp[0][idx]; } int32_t main () { ll n, k; cin >> n >> k; for(int i = 0;i<n;i++) cin >> arr[i]; pref[0] = arr[0]; for(int i = 0;i<2;i++)dp[i].resize(n+1); for(int i = 1;i<n;i++)pref[i] = pref[i-1]+arr[i]; if(n == 2) { long long ans = arr[0] * arr[1]; cout << ans << "\n"; cout << 1 << "\n"; return 0; } for(int i= 0;i<=n;i++) { for(int j = 0;j<=k+1;j++) { pre[i][j] = -1; } } deque<ll> dq; for(int j = 1;j<=k;j++) { dq.clear(); for(int i = 0;i<n;i++) { ll cur = i, x = pref[n-1]-pref[i], ans = 0; if(j > 1) { while(dq.size() >= 2 && val(dq.back(), x) <= val(dq[dq.size()-2], x))dq.pop_back(); } if(dq.size()){ int z = dq.back(); ans = dp[0][z] + (pref[i]-pref[z])*(pref[n-1]-pref[i]); pre[i][j] = dq.back(); } else { ans = pref[i]*(pref[n-1]-pref[i]); pre[i][j] = -1; } dp[1][i] = ans; if(j > 1 and i!=n-2) { while(dq.size() >= 2 && slope(cur, dq[0], dq[1]))dq.pop_front(); dq.push_front(cur); } // cout << dp[1][i] << " "; } // cout << "\n"; dp[0].swap(dp[1]); } ll mx = -1, idx = -1; for(int i = 0;i<n;i++) { if(dp[0][i] >= mx) { mx = dp[0][i]; idx = i; } } cout << mx << "\n"; while(idx!=-1 and k > 0) { cout << idx+1 << " "; idx = pre[idx][k]; 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...