Submission #1152877

#TimeUsernameProblemLanguageResultExecution timeMemory
1152877KluydQSplit the sequence (APIO14_sequence)C++17
71 / 100
2098 ms111336 KiB
#include <bits/stdc++.h> //#include "grader.h" #define respagold ios_base::sync_with_stdio(0), cin.tie(0); //#define int long long #define ll long long #define int2 __int128_t #define FOR( i, x, n, d ) for( int i = x; i <= n; i += d ) #define FORR( i, x, n, d ) for( int i = x; i >= n; i -= d ) #define F first #define S second #define all(x) x.begin(), x.end() #define sz(x) (int)(x.size()) #define pb push_back #define ins insert #define lb lower_bound #define ub upper_bound #define pii pair <int, int> #define pll pair <ll, ll> #define mkp make_pair using namespace std; const int N = 1e5 + 123; const ll inf = 1e18; ll a[N], b[N], n, m, k, z, w, x, y, mm[N], cc[N]; ll dp[N]; int par[N][201]; mt19937 rng( chrono::steady_clock::now().time_since_epoch().count()); int rand( int l, int r ) { uniform_int_distribution <int> uid( l, r ); return uid( rng ); } pair <int, pll> t[33 * N], sv[N], sv1[N]; int L[33 * N], R[33 * N], timer = 1; void add( pair <int, pll> nw, int v = 1, int l = 0, int r = 1e9 + 1 ) { int md = ( l + r ) >> 1; bool lef = ( nw.S.F * l + nw.S.S > t[v].S.F * l + t[v].S.S ), mid = ( nw.S.F * md + nw.S.S > t[v].S.F * md + t[v].S.S ); if( mid ) swap( nw, t[v] ); if( l + 1 == r ) return; if( lef == mid ) { if( !R[v] ) R[v] = ++ timer; add( nw, R[v], md, r ); } else { if( !L[v] ) L[v] = ++ timer; add( nw, L[v], l, md ); } } pll get( int pos, int v = 1, int l = 0, int r = 1e9 + 1 ) { int md = ( l + r ) >> 1; pll res = { t[v].S.F * pos + t[v].S.S, t[v].F }; if( l + 1 == r ) return res; if( pos < md && L[v] ) res = max( res, get( pos, L[v], l, md )); if( pos >= md && R[v] ) res = max( res, get( pos, R[v], md, r )); return res; } void solve() { cin >> n >> k; FOR( i, 1, n, 1 ) cin >> a[i], b[i] = b[i - 1] + a[i]; sv1[0] = { 0, { 0, 0 }}; FOR( bl, 1, k, 1 ) { FOR( i, bl, n - k + bl - 1, 1 ) { // for i find k that ( dp[k] + sum(k + 1, i) * sum(i + 1, n) ) is max // dp[i] = dp[k] + ( b[i] - b[k] ) * ( b[n] - b[i] ) // dp[i] = dp[k] + b[i] * b[n] - b[i] * b[i] - b[k] * b[n] + b[k] * b[i]; // dp[i] = ( dp[k] - b[k] * b[n] ) + ( b[i] * b[n] - b[i] * b[i] ) + ( b[k] * b[i] ) add( sv1[i - 1] ); pll j = get(b[i]); dp[i] = j.F + b[i] * b[n] - b[i] * b[i]; sv[i] = { i, { b[i], dp[i] - b[i] * b[n] }}; par[i][bl] = j.S; } FOR( i, 1, n, 1 ) sv1[i] = sv[i]; FOR( i, 1, timer, 1 ) t[i] = { 0, { 0, 0 }}, L[i] = R[i] = 0; timer = 1; } ll ans = -inf, id = 0; FOR( i, 1, n - 1, 1 ) { if( dp[i] >= ans ) ans = dp[i], id = i; } vector <int> v; FORR( blo, k, 1, 1 ) v.pb( id ), id = par[id][blo]; reverse( all( v )); cout << ans << '\n'; for( auto i : v ) cout << i << ' '; } signed main() { // freopen("connect.in", "r", stdin); // freopen("connect.out", "w", stdout); respagold int test = 1; if( !test ) cin >> test; while( test -- ) { solve(); } } // solved by KluydQ
#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...