- 「一本通 5.6 练习 4」打印文章
怎么老是是这种没有上传的题目!!!题解:
- 2024-6-7 12:20:30 @
#include #include #define N 500010 #define db double #define ll long long using namespace std; int n,m,g[N],l,len; ll a[N],sum[N],f[N];
inline int read() { int x=0; char c=getchar(); while (c<'0' || c>'9') c=getchar(); while (c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x; }
ll sqr(ll x) {return x*x;}
ll solve(int x,int y) {return (db)(f[x]+sqr(sum[x])-f[y]-sqr(sum[y]))/(sum[x]-sum[y]);}
int main() { freopen("#10191.in","r",stdin); freopen("#10191.out","w",stdout); // f[i]=min{f[j]+(sum[i]-sum[j])^2+a[i]^2}; while (scanf("%d%d",&n,&m)==2) { for (int i=1;i<=n;i++) a[i]=read(),sum[i]=sum[i-1]+a[i]; l=len=0; for (int i=1;i<=n;i++) { while (l<len && solve(g[l+1],g[l])<2*sum[i]) l++; f[i]=f[g[l]]+sqr(sum[i]-sum[g[l]])+m; while (l<len && solve(g[len],g[len-1])>solve(i,g[len])) len--; g[++len]=i; } printf("%lld\n",f[n]); } return 0; }
1 comments
-
xxw6 LV 8 @ 2025-4-8 13:34:51
对
- 1
Information
- ID
- 1214
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 10
- Tags
- # Submissions
- 2
- Accepted
- 0
- Uploaded By