제출 #443217

#제출 시각아이디문제언어결과실행 시간메모리
443217hivakarami수열 (APIO14_sequence)C++14
100 / 100
1681 ms82332 KiB
#include<bits/stdc++.h>

 
using namespace std;
 
typedef long long int ll;
typedef long double ld;
#define f first
#define s second
#define pb push_back
#define pii pair<int, int>

 
const int N = 100000 + 100;
const int K = 200 + 100;
const ll inf = 1e18;

ll ps[N], dp[N][2], a[N];
int op[K][N];

inline ll get(int l, int r)
{
	ll sum = ps[r] - ps[l];
	return (sum * (sum-1)) / 2;
}

void solve(int l, int r, int opl, int opr, int k)
{
	//cout << l << ' ' << r << ' ' << opl << ' ' << opr << endl;
	if(l >= r || opr < opl)
		return;
	
	int mid = (l + r) / 2;
	op[k][mid] = opl;
	for(int i = opl; i < min(mid, opr); i++)
	{
		if(dp[mid][1] > dp[i][0] + get(i+1, mid+1))
		{
			dp[mid][1] = dp[i][0] + get(i+1, mid+1);
			op[k][mid] = i;
		}
	}
	
	solve(l, mid, opl, op[k][mid]+1, k);
	solve(mid+1, r, op[k][mid], opr, k);
	
}



int main()
{
    
    ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);	

	int n, k;
	cin >> n >> k;
	k++;
	for(int i = 0; i < n; i++)
		cin >> a[i];
		
	for(int i = 1; i <= n; i++)
		ps[i] = ps[i-1] + a[i-1];	

	for(int i = 0; i < n; i++)
		dp[i][1] = get(0, i+1);
	
	for(int i = 2; i <= k; i++)
	{
		for(int j = 0; j < n; j++)
		{
			dp[j][0] = dp[j][1];
			dp[j][1] = inf;
		}
		solve(0, n, 0, n, i);
	}

	/*
	for(int j = 1; j <= k; j++)
		for(int i = 0; i < n; i++)
			cout << i << ' ' << j << ' ' << dp[i][j] << endl;
	*/
	
	cout << get(0, n) - dp[n-1][1] << endl;

	int i = n-1, j = k;
	while(j > 1)
	{
		cout << op[j][i] + 1 << ' ';
		//v.pb(op[i][j] + 1);
		i = op[j][i];
		j--;
	}
	cout << endl;


	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...