zoukankan      html  css  js  c++  java
  • bzoj4518[Sdoi2016] 征途

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4518

    题目大意:

    相当于:n个数字,将其分成m段,每段的数字和为该段的值,使方差最小..

    ===========================================

    题解:

    斜率优化【mdzz啊(口亨一定是题目表述不清!!!搞了我那么久

    因为分成的段数的固定的,那么平均数sm也是固定的(这里的sum为总和)

    所以方程很容易写到:

    f[k][i]=f[k-1][j]+(sum[i]-sum[j]-sm)^2;

    (设f[k][i]为以i为结尾已经分成了k段,sum[i]为前缀和)

    -> 2*(sum[i]-sm)*sum[j]+f[k][i]=f[k-1][j]+sum[j]^2 +(sum[i]-sm)^2;

    于是截距式就出来了,斜率优化QwQmd自己好zz

    因为答案要乘上m^2,所以把m^2直接乘丢到式子里,即将所有数都先*m,最后再除个m,化简过程可以自己试试。

    习惯了这种二维搞滚动orz不搞应该也行....吧日常LL咯~(我已经不管究竟要不要了= =反正又不会爆233

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    #define maxn 31000
    
    int l,r,q[maxn],t;
    LL sum[maxn],a[maxn],f[2][maxn];
    LL sqrr(LL x){return x*x;}
    double X(int j){return sum[j];}
    double Y(int j){return f[1-t][j]+sqrr(sum[j]);}
    double slop(int j1,int j2) {return (Y(j2)-Y(j1))/(X(j2)-X(j1));}
    int main()
    {
    	int n,m,i,k;LL sm;
    	sm=sum[0]=0;
    	scanf("%d%d",&n,&m);
    	for (i=1;i<=n;i++)
    	{
    		scanf("%lld",&a[i]);
    		sm+=a[i];a[i]*=m;
    		sum[i]=sum[i-1]+a[i];
    	}t=1;
    	memset(f,63,sizeof(f));f[0][0]=0;
    	for (i=1;i<=n;i++) f[0][i]=sqrr(sum[i]-sm);
    	for (k=1;k<=m;k++)
    	{
    		l=r=1;q[l]=0;
    		memset(f[t],63,sizeof(f[t]));
    		for (i=1;i<=n;i++)
    		{
    			while (l<r && slop(q[l],q[l+1])<(sum[i]-sm)*2) l++;
    			int j=q[l];
    			f[t][i]=f[1-t][j]+sqrr(sum[i]-sum[j]-sm);
    			while (l<r && slop(q[r-1],q[r])>slop(q[r],i)) r--;
    			q[++r]=i;
    		}t=1-t;
    	}printf("%lld
    ",f[1-t][n]/m);
    	return 0;
    }


  • 相关阅读:
    memcached 细究(一)
    centos文件/文件夹操作-检查磁盘、内存、cpu使用情况-vi操作命令
    判断php变量是否定义,是否为空,是否为真的一览表
    php 在函数前面加个@的作用
    apache Header set Cache-Control
    windows上memecache添加多个端口命令
    Android 4.4KitKat AudioFlinger 流程分析
    Android 4.4KitKat Sound System
    Android 4.4KitKat AudioTrack 流程分析
    Android Shell Cmd
  • 原文地址:https://www.cnblogs.com/Euryale-Rose/p/6527861.html
Copyright © 2011-2022 走看看