新人求助,WA一个点很难受
  • 板块P4983 忘情
  • 楼主JK_LOVER
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/11/11 08:44
  • 上次更新2023/11/5 08:17:52
查看原帖
新人求助,WA一个点很难受
227824
JK_LOVER楼主2020/11/11 08:44
#include<bits/stdc++.h>
using namespace std;
int read() {
	int x = 0,f = 0;char ch = getchar();
	while(!isdigit(ch)) {if(ch == '-')f = 1;ch = getchar();}
	while(isdigit(ch)) {x = x * 10 + ch - '0';ch = getchar();}
	return f ? -x : x;
} 
#define ll long long
const ll inf = 1e18;
const int N = 1e5 + 100;
ll f[N],g[N],q[N],s[N];
int n,m;
#define Y(a) (f[a]+s[a]*s[a]-2*s[a])
#define X(a) (s[a]) 
long double K(int a,int b) {
	return (long double)(Y(b) - Y(a)) / (X(b) - X(a));
}
void check(ll mid) {
	f[0] = 0;int l = 1,r = 1;q[1] = 0;
	for(int i = 1;i <= n;i++) {
		while(l < r && K(q[l],q[l + 1]) <= 2 * s[i]) l++;
		f[i] = f[q[l]] + (s[i] - s[q[l]] + 1) * (s[i] - s[q[l]] + 1) + mid;
		g[i] = g[q[l]] + 1;
		while(l < r && K(q[r - 1],q[r]) >= K(q[r - 1],i)) r--;
		q[++r] = i;
	}
}
int main() {
	n = read();m = read();
	for(int i = 1;i <= n;i++) s[i] = s[i - 1] + read();
	ll l = 0,r = inf,ans = 0;
	while(l <= r) {
		ll mid = l + r >> 1;check(mid);
		if(g[n] <= m) ans = mid , r = mid - 1;
		else l = mid + 1;	
	}
	check(ans);
	printf("%lld\n",f[n] - g[n] * ans);
	return 0;
}

斜率优化出现精度问题了,好像?

2020/11/11 08:44
加载中...