一点小疑问

P4072 [SDOI2016] 征途

```cpp #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=3100; int a[N];LL s[N],f[N][N]; int l,r,Q[N]; double X(int j){return 1.0*s[j];} double Y(int j,int k){return 1.0*(f[j][k-1]+s[j]*s[j]);} double slop(int j1,int j2,int k){ if(!(X(j2)-X(j1)))return 1e18; return (Y(j2,k)-Y(j1,k))/(X(j2)-X(j1)); } int main(){ int n,m;scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); s[i]=s[i-1]+a[i]; } for(int i=0;i<=n;i++)f[i][1]=s[i]*s[i]; for(int k=2;k<=m;k++){ l=r=1;Q[l]=0; for(int i=1;i<=n;i++){ while(l<r&&slop(Q[l],Q[l+1],k)<2.0*s[i])l++; int j=Q[l]; f[i][k]=f[j][k-1]+(s[i]-s[j])*(s[i]-s[j]); while(l<r&&slop(Q[r-1],Q[r],k)>slop(Q[r],i,k))r--; Q[++r]=i; } } printf("%lld",-s[n]*s[n]+f[n][m]*m); return 0; } ```
by reclusive @ 2023-09-12 09:04:49


```cpp #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=3100; int a[N];LL s[N],f[N][N]; int l,r,Q[N]; double X(int j){return 1.0*s[j];} double Y(int j,int k){return 1.0*(f[j][k-1]+s[j]*s[j]);} double slop(int j1,int j2,int k){ if(!(X(j2)-X(j1)))return 1e18; return (Y(j2,k)-Y(j1,k))/(X(j2)-X(j1)); } int main(){ int n,m;scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); s[i]=s[i-1]+a[i]; } for(int i=1;i<=n;i++)f[i][1]=s[i]*s[i]; for(int k=2;k<=m;k++){ l=r=1;Q[l]=0; for(int i=1;i<=n;i++){ while(1){ if(l>=r)break; if(X(Q[l+1])-X(Q[l])<0){ if((Y(Q[l+1],k)-Y(Q[l],k))>2.0*s[i]*(X(Q[l+1])-X(Q[l])))l++; else break; } else{ if((Y(Q[l+1],k)-Y(Q[l],k))<2.0*s[i]*(X(Q[l+1])-X(Q[l])))l++; else break; } } int j=Q[l]; f[i][k]=f[j][k-1]+(s[i]-s[j])*(s[i]-s[j]); while(l<r&&(Y(Q[r],k)-Y(Q[r-1],k))*(X(i)-X(Q[r]))>(Y(i,k)-Y(Q[r],k))*(X(Q[r])-X(Q[r-1])))r--; Q[++r]=i; } } printf("%lld",-s[n]*s[n]+f[n][m]*m); return 0; } ```
by reclusive @ 2023-09-12 09:06:14


如果不预处理的话,只能40分
by reclusive @ 2023-09-12 09:06:56


|