제출 #1152522

#제출 시각아이디문제언어결과실행 시간메모리
1152522KluydQSplit the sequence (APIO14_sequence)C++20
0 / 100
31 ms80452 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 mkp make_pair using namespace std; const int N = 1e5 + 123; const int inf = 1e18; int a[N], b[N], n, m, k, z, w, x, y, mm[N], cc[N]; int dp[N], 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 ); } struct line { int m, c, id; line( int m, int c, int id ): m(m), c(c), id(id) {} line(): m(0), c(-inf), id(0) {} int get( int x ) { return m * x + c; } }; line t[33 * N], sv[N]; int L[33 * N], R[33 * N], id[4 * N], timer = 1; void add( line nw, int v = 1, int l = 0, int r = 1e9 + 1 ) { int md = ( l + r ) >> 1; bool lef = ( nw.get(l) > t[v].get(l) ), mid = ( nw.get(md) > t[v].get(md) ); 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 ); } } pii get( int pos, int v = 1, int l = 0, int r = 1e9 + 1 ) { int md = ( l + r ) >> 1; pii res = { t[v].get(pos), t[v].id }; 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]; add( line(0, 0, 0) ); FOR( bl, 1, k, 1 ) { FOR( i, 1, n, 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] ) pii j = get(b[i]); dp[i] = j.F + b[i] * b[n] - b[i] * b[i]; sv[i] = line( b[i], dp[i] - b[i] * b[n], i ); par[i][bl] = j.S + 1; } FOR( i, 1, timer, 1 ) t[i] = line(), L[i] = R[i] = 0; timer = 1; FOR( i, 1, n, 1 ) add( sv[i] ); } int ans = 0, id = 0; FOR( i, 1, n, 1 ) ans = max( ans, dp[i] ); FOR( i, 1, n, 1 ) { if( ans == dp[i] ) id = i; } int blo = k; vector <int> v; while( blo -- ) 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...