社区讨论
刚学斜率优化,求助,WA 90pts
P4072[SDOI2016] 征途参与者 7已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @lod74non
- 此快照首次捕获于
- 2023/10/31 01:50 2 年前
- 此快照最后确认于
- 2023/11/05 12:18 2 年前
Code:
CPP#include <cstdio>
#include <cstring>
using namespace std ;
typedef long long ll ;
const int MAXN = 3e3 + 10 ;
int n , m , q[MAXN] , head , tail ;
ll f[MAXN][MAXN] , sum[MAXN] , a[MAXN] ;
double slope (int j1 , int j2 , int now) {
return (f[j2][now] + sum[j2] * sum[j2] - f[j1][now] - sum[j1] * sum[j1]) * 1.0 / (sum[j2] - sum[j1]) ;
}
int main () {
scanf ("%d %d" , &n , &m) ;
for (int i = 1 ; i <= n ; i++)
scanf ("%lld" , &a[i]) , sum[i] = sum[i - 1] + a[i] ;
memset (f , 0x3f , sizeof (f)) ;
for (int i = 1 ; i <= n ; i++) f[i][1] = sum[i] * sum[i] ;
for (int k = 2 ; k <= m ; k++) {
head = 1 ; tail = 1 ;
q[1] = k ;
for (int i = k + 1 ; i <= n ; i++) {
while (head < tail && slope (q[head] , q[head + 1] , k - 1) < 2 * sum[i]) head++ ;
int j = q[head] ;
f[i][k] = f[j][k - 1] + (sum[i] - sum[j]) * (sum[i] - sum[j]) ;
while (head < tail && slope (q[tail - 1] , q[tail] , k - 1) >= slope (q[tail] , i , k - 1)) tail-- ;
q[++tail] = i ;
}
}
printf ("%lld" , 1LL * f[n][m] * m - 1LL * sum[n] * sum[n]) ;
return 0 ;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...