제출 #989684

#제출 시각아이디문제언어결과실행 시간메모리
989684vjudge1수열 (APIO14_sequence)C++17
33 / 100
451 ms82768 KiB
#include<bits/stdc++.h> #define pll pair<ll, ll> #define fi first #define se second #define ll long long #define pb push_back #define ar array #define vi vector #define bit(i,x) ((x >> i) & 1ll) #define all(x) x.begin(),x.end() #define low(l,r,x) x.begin()+l,x.begin()+r #define len(l,r) (r-l+1) #define PI acos(-1.0) template <class T> void setmin(T &a, T b) { if(b < a) a = b; } template <class T> void setmax(T &a, T b) { if(b > a) a = b; } const long long mod = 998244353, N = 1e5, INF = 1e18, Log = 19, MASK = 1 << 19; using namespace std; vector<ll> dp_before, dp_cur; ll pfs[N+5] , perf[N+5]; int n , k; int trace[201][N+5]; ll C(ll i , ll j) { ll k = pfs[j] - pfs[i-1]; ll res = k*k; res -= (perf[j] - perf[i-1]); return res; } void compute(ll x,ll l,ll r, ll optl, ll optr) { if(l > r) return; ll mid = (l+r) >> 1; pll best = {INF,-1}; for(int i = optl; i <= min(mid,optr);i++) { // best = min(best, {dp_before[i-1] + C(i,mid),i}); if(dp_before[i-1] + C(i,mid) <= best.fi) { best.fi = dp_before[i-1] + C(i,mid); best.se = i; } } if(best.se == -1) return; dp_cur[mid] = best.fi; trace[x][mid] = best.se - 1; int opt = best.se; compute(x,l,mid-1,optl,opt); compute(x,mid+1,r,opt,optr); } void kazuha() { cin >> n >> k; ll a[n+5]; pfs[0] = 0; perf[0] = 0; for(int i = 1; i <= n;i++) { cin >> a[i]; pfs[i] = pfs[i-1] + a[i]; perf[i] = perf[i-1] + a[i]*a[i]; } ll ans = pfs[n]*pfs[n] - perf[n]; dp_cur.assign(n+5,INF); dp_before.assign(n+5,INF); dp_before[0] = 0; dp_cur[0] = 0; for(int i = 1; i <= k+1;i++) { compute(i,1,n,1,n); dp_before = dp_cur; } ans = (ans - dp_before[n])/2; cout << ans << '\n'; ll i = k+1, j = n; vi<ll> v; while(trace[i][j]) { v.push_back(trace[i][j]); j = trace[i--][j]; } reverse(all(v)); for(auto k : v) { cout << k << " "; } cout << '\n'; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); // freopen("permutation.cpp", "r", stdin); // freopen("permutation.cpp", "w", stdout); long long mitsu = 1; // cin >> mitsu; for(long long seele = 0; seele < mitsu;seele++) { // cout << "Case " << seele << " :"; kazuha() ; } }
#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...