제출 #1186675

#제출 시각아이디문제언어결과실행 시간메모리
1186675thieunguyenhuy수열 (APIO14_sequence)C++20
100 / 100
676 ms81428 KiB
#include <bits/stdc++.h> using namespace std; #define POPCOUNT(n) (__builtin_popcountll((n))) #define CLZ(n) (__builtin_clzll((n))) #define CTZ(n) (__builtin_ctzll((n))) #define LOG(n) (63 - __builtin_clzll((n))) #define BIT(n, i) (((n) >> (i)) & 1ll) #define MASK(i) (1ll << (i)) #define FLIP(n, i) ((n) ^ (1ll << (i))) #define ON(n, i) ((n) | MASK(i)) #define OFF(n, i) ((n) & ~MASK(i)) #define Int __int128 #define fi first #define se second typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<int, int> pii; typedef pair<long long, long long> pll; typedef pair<long long, int> pli; typedef pair<int, long long> pil; typedef vector<pair<int, int>> vii; typedef vector<pair<long long, long long>> vll; typedef vector<pair<long long, int>> vli; typedef vector<pair<int, long long>> vil; template <class T1, class T2> bool maximize(T1 &x, T2 y) { if (x < y) { x = y; return true; } return false; } template <class T1, class T2> bool minimize(T1 &x, T2 y) { if (x >= y) { x = y; return true; } return false; } template <class T> void remove_duplicate(vector<T> &ve) { sort (ve.begin(), ve.end()); ve.resize(unique(ve.begin(), ve.end()) - ve.begin()); } mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); template <class T1, class T2> T1 random(T1 l, T2 r) { return uniform_int_distribution<T1>(l, r)(rng); } template <class T> T random(T r) { return rng() % r; } const int N = 100000 + 5, K = 200 + 5; const int MOD = 1e9 + 7; const int inf = 1e9; const long long INF = 1e18; int n, k; int a[N], pref[N], opt[K][N]; vector<ll> pre_dp, cur_dp; ll square(int x) { return 1ll * x * x; } ll get_cost(int l, int r) { return square(pref[r] - pref[l - 1]); } void dnc(const int x, int l, int r, int optL, int optR) { if (l > r) return; int mid = (l + r) >> 1; cur_dp[mid] = 2 * INF; int optMid = -1; for (int p = optL; p <= min(optR, mid); ++p) if (minimize(cur_dp[mid], pre_dp[p - 1] + get_cost(p, mid))) optMid = p; opt[x][mid] = optMid; dnc(x, l, mid - 1, optL, optMid); dnc(x, mid + 1, r, optMid, optR); } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> k; ++k; for (int i = 1; i <= n; ++i) cin >> a[i]; pref[0] = 0; for (int i = 1; i <= n; ++i) pref[i] = pref[i - 1] + a[i]; cur_dp.assign(n + 1, 0), pre_dp.assign(n + 1, 0); for (int i = 1; i <= n; ++i) { cur_dp[i] = get_cost(1, i); opt[1][i] = 1; } for (int i = 2; i <= k; ++i) { swap(cur_dp, pre_dp); dnc(i, 1, n, 1, n); } vector<int> ans; int p = n; for (int cnt = k; cnt > 1; --cnt) { ans.emplace_back(opt[cnt][p] - 1); p = opt[cnt][p] - 1; } reverse(ans.begin(), ans.end()); cout << (square(pref[n]) - cur_dp[n]) / 2 << '\n'; for (auto &x : ans) cout << x << ' '; return 0; }
#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...