求助为什么这样子过不了
查看原帖
求助为什么这样子过不了
574580
lijinguang楼主2023/4/25 17:29
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<cmath>
#include<set>
#include<stack>
#include<unordered_map>
#include<map>
#include<cstdio>
#define endl '\n'
#define ll long long
#define x first
#define y second
#define PII pair<int,int>
#define de(x) cout<<x<<endl
#define dee(x) cout<<x<<" "
#define mem(x,y) memset(x, y, sizeof x)
//#define double db
//#define int ll 
//#define double long double


using namespace std;
const int N = 100010, M = N * 2;
const ll mod = 1e9 + 7;
const ll mod1 = 983231753;

int n, k;
ll a[N],b[N];
ll f[N];
ll g[N];
ll sum[N];
int q[N];
int d[N][500];

ll X(int xx) { return sum[xx]; }
ll Y(int yy) { return g[yy] - sum[yy] * sum[yy]; }

int slope_up(int a, int b)
{
	return Y(a) - Y(b);
}

int slope_down(int a, int b)
{
	return X(a) - X(b);
}


//double slope(int i, int j)
//{
//	if (sum[i] == sum[j])
//	{
//		return -1e8;
//	}
//	return 1.0 * (Y(i) - Y(j)) / (X(i) - X(j));
//}

inline double slope(int u, int v) {
	if (sum[u] == sum[v])return -1e8;//attention!!!
	return 1.0 * ((1.0 * (Y(u) - Y(v))) / (1.0 * (X(u) - X(v))));
}

void solve()
{

	cin >> n >> k;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	for (int i = 1; i <= n; i++)
	{
		sum[i] = sum[i - 1] + a[i];
	}


	for (int tim = 1; tim <= k; tim++)
	{
		int head = 1;
		int tail = 1;
		mem(q, 0);
		q[head] = 0;
		for (int i = 1; i <= n; i++)
		{
			while (head < tail && slope(q[head + 1], q[head]) >= -sum[i])
			{
				++head;
			}
			int j = q[head];
			f[i] = g[j] + sum[i] * sum[j] - sum[j] * sum[j];
			d[i][tim] = j;
			while (head < tail && slope(q[tail], q[tail - 1]) <= slope(i, q[tail])) --tail;
			q[++tail] = i;
		}
		for (int i = 1; i <= n; i++)
		{
			g[i] = f[i];
		}
	}
	cout << f[n] << endl;
	stack<int>ss;
	int p = n;
	int cnt = 0;
	while (p) {
		b[++cnt] = p;
		p = d[p][k];
		k--;
	}
	for (int i = cnt; i >= 2; i--)printf("%d ", b[i]);
}


signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t;
	t = 1;
	while (t--)
	{
		solve();
	}
	return 0;
}
2023/4/25 17:29
加载中...