제출 #964209

#제출 시각아이디문제언어결과실행 시간메모리
964209Mike_Vu수열 (APIO14_sequence)C++14
0 / 100
64 ms82000 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); } struct Line{ ll m, b; int pos; Line(ll slope, ll intercept, int p) { m = slope; b = intercept; pos = p; } ll operator () (ll x) {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 = 1e5+3, maxk = 202; int n, k; ll dp[maxn], dpbef[maxn], ps[maxn]; int track[maxn][maxk], a[maxn]; void dnc(int l, int r, int opl, int opr, int j) { if (l > r) return; int mid = (l + r) >> 1; if (mid < j) return; ll res = LLONG_MIN; int temp = -1; for (int i = opl; i <= min(mid, opr); i++) { ll cost = dpbef[i-1]+(ps[n]-ps[mid])*(ps[mid]-ps[i-1]); if (cost > res) { res = cost; temp = i-1; } } dp[mid] = res; track[mid][j] = temp; dnc(l, mid-1, opl, track[mid][j], j); dnc(mid+1, r, track[mid][j], opr, j); } 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] = (ps[n]-ps[i])*(ps[i]); } // for (int j = 2; j <= k; j++) { // cht.init(); // swap(dp, dpbef); // for (int i = j; i < n; i++) { // cht.update(Line(-ps[i-1], dpbef[i-1], i-1)); // dp[i] = ps[i]*(ps[n]-ps[i])+cht.query(ps[n]-ps[i]); // track[i][j] = temp; // } // } for (int j = 2; j <= k; j++) { swap(dp, dpbef); dnc(1, n-1, 1, n-1, j); } int ans = k; for (int i = k; i < n; i++){ if (dp[i] > dp[ans]) ans = i; } vector<int> tr; cout << dp[ans] << "\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...