제출 #1270774

#제출 시각아이디문제언어결과실행 시간메모리
1270774cmiuc수열 (APIO14_sequence)C++20
0 / 100
0 ms328 KiB
#include <iostream> #include <vector> using namespace std; #define int long long const int N = 1<<17; int strt[N], dp[N][201], Par[N][201], a[N]; int intersection(int i1, int i2, int k){ int m1 = a[i1], m2 = a[i2], c1 = dp[i1][k] - a[i1] * a[i1], c2 = dp[i2][k] - a[i2] * a[i2]; if (m1 == m2){ if (c1 > c2) return 2e9; return -1; } int x = (c2 - c1 + (m1 - m2 - 1)) / (m1 - m2); return x; } void solve(int n, int k){ if (k == 0){ cout<<n<<' '; return; } solve(Par[n][k], k - 1); cout<<n<<' '; } signed main(){ int n, K; cin>>n>>K; for (int i=1;i<=n;i++) cin>>a[i], a[i] += a[i-1]; for (int k=1;k<=K;k++){ vector<int> vec; for (int i=1;i<=n;i++){ int l = 0, r = vec.size(); while (l + 1 < r){ int mid = (l + r) / 2; if (strt[vec[mid]] <= a[i]) l = mid; else r = mid; } if (vec.size() > 0){ Par[i][k] = vec[l]; dp[i][k] = dp[vec[l]][k-1] + a[vec[l]] * (a[i] - a[vec[l]]); } while (vec.size() > 0 and intersection(vec.back(), i, k-1) <= strt[vec.back()]) vec.pop_back(); if (vec.size() > 0) strt[i] = intersection(vec.back(), i, k - 1); vec.push_back(i); } } cout<<dp[n][K]<<'\n'; solve(Par[n][K], K - 1); 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...