제출 #964167

#제출 시각아이디문제언어결과실행 시간메모리
964167Mike_Vu수열 (APIO14_sequence)C++14
71 / 100
120 ms131072 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef double dou; #define pii pair<int, int> #define pb push_back #define fi first #define se second //const ll mod = 1e9+7; bool maximize(ll &x, ll y ){ if (x < y) {x = y; return true;}; return false; } bool minimize(ll &x, ll y){ if (x > y) {x = y; return true;} return false; } //void add(ll &x, ll y ){ // x += y; // if (x >= mod) x -= mod; //} //void sub(ll &x, ll y) { // x -= y; // if (x < 0) x += mod; //} ll divi(ll x, ll y ){ if (x == 0 || y == 0) return 0; return x/y - ((x^y)<0&&x%y); } int temp; struct Line{ ll m, b; int pos; Line(ll slope, ll intercept, int p) { m = slope; b = intercept; pos = p; } ll operator () (ll x) {temp = pos; return m*x+b;} friend ll inter(Line a, Line b){ return divi(b.b-a.b, a.m-b.m); } }; struct CHT{ vector<pair<Line, ll>> hull; void init() { hull.clear(); } void update(Line a) { while (!hull.empty() && hull.back().se <= (inter(hull.back().fi, a))) { hull.pop_back(); } if (hull.empty()) { hull.push_back(make_pair(a, LLONG_MAX)); return; } hull.push_back(make_pair(a, inter(a, hull.back().fi))); } ll query(ll x) { int pos = 0; for (int k = hull.size()/2; k > 0; k >>= 1) { while (pos+k < (int)hull.size() && hull[pos+k].se >= x) pos += k; } return hull[pos].fi(x); } } cht; const int maxn = 2e5+5, maxk = 305; int n, k; ll a[maxn], dp[maxn][maxk], ps[maxn], track[maxn][maxk]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k; ps[0] = 0; for (int i = 1; i <= n; i++) { cin >> a[i]; ps[i] = ps[i-1] + a[i]; } for (int i = 1; i < n; i++) { dp[i][1] = (ps[n]-ps[i])*(ps[i]); } for (int j = 2; j <= k; j++) { cht.init(); for (int i = j; i < n; i++) { // cout << -ps[i-1] << ' ' << dp[i-1][j-1] << endl; cht.update(Line(-ps[i-1], dp[i-1][j-1], i-1)); // system("pause"); dp[i][j] = ps[i]*(ps[n]-ps[i])+cht.query(ps[n]-ps[i]); // system("pause"); track[i][j] = temp; } } int ans = k; for (int i = k; i < n; i++){ if (dp[i][k] > dp[ans][k]) ans = i; } vector<int> tr; cout << dp[ans][k] << "\n"; tr.pb(ans); while (k > 1) { ans = track[ans][k]; --k; tr.push_back(ans); } for (int i = (int)tr.size()-1; i >= 0; i--) { cout << tr[i] << ' '; } } /* 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...