4518: [Sdoi2016]征途

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit:
230  Solved: 156
[Submit][Status][Discuss]

Description

Pine开始了从S地到T地的征途。
从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站。
Pine计划用m天到达T地。除第m天外,每一天晚上Pine都必须在休息站过夜。所以,一段路必须在同一天中走完。
Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小。
帮助Pine求出最小方差是多少。
设方差是v,可以证明,v×m^2是一个整数。为了避免精度误差,输出结果时输出v×m^2。
 

Input

第一行两个数 n、m。
第二行 n 个数,表示 n 段路的长度

Output

一个数,最小方差乘以 m^2 后的值

Sample Input

5 2
1 2 5 8 6

Sample Output

36

HINT

1≤n≤3000,保证从 S 到 T 的总路程不超过 30000

Source

鸣谢Menci上传

Solution

DP + 斜率优化

首先对所求的东西进行一下化简:

即最后的结果为$m*\sum_{i=1}^{m}x_{i}^{2}-\sum_{i=1}^{m}x_{i}$其中$x_{i}$表示第$i$天走的路段总和

很显然有$\sum_{i=1}^{m}x_{i}$为定值,那么只需要最小化$\sum_{i=1}^{m}x_{i}^{2}$

那么考虑$f[i][j]$表示$i$天共走了$j$段路的最优

首先可以有某天停滞不前,那么很容易发现,若要最优,则不可能停滞不前

可以得到转移$dp[i][j]=min(dp[i][j],dp[i-1][j-k]+(sum[j]-sum[j-k])^{2}),k=1-j$

那么固定下$i$后,很显然对于$j$是满足斜率优化的

那么化简就可以得到$\frac{dp[i-1][k_{1}]+sum[k_{1}]^{2}-dp[i-1][k_{2}]-sum[k_{2}]^{2}}{sum[k_{1}]-sum[k_{2}]}<2*sum[j]$

那么斜率优化即可,自己还打了个滚动数组,不过貌似毫无意义

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
inline int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define maxn 3010
int n,m; int dis[maxn],que[maxn],l,r;
long long dp[][maxn],sum[maxn];
long long pf(long long x) {return x*x;}
inline double slope(int t,int i,int j)
{
return (double)(dp[t][i]+pf(sum[i])-dp[t][j]-pf(sum[j]))/(double)(sum[i]-sum[j]);
}
int main()
{
n=read(),m=read();
for (int i=; i<=n; i++) dis[i]=read(),sum[i]=sum[i-]+dis[i];
memset(dp,,sizeof(dp)); dp[][]=;
for (int t=,i=; i<=m; i++,t^=,l=r=)
for (int tmp,j=; j<=n; j++)
{
while (l<r && slope(t^,que[l],que[l+])<(sum[j]<<)) l++;
tmp=que[l];
dp[t][j]=pf(sum[j]-sum[tmp])+dp[t^][tmp];
while (l<r && slope(t^,que[r],que[r-])>slope(t^,que[r],j)) r--;
que[++r]=j;
}
printf("%lld\n",m*dp[m&][n]-pf(sum[n]));
return ;
}

在BZOJ上好像排名不高啊....

【BZOJ-4518】征途 DP + 斜率优化的更多相关文章

  1. BZOJ - 4518: 征途(斜率优化,求N数划分为M区间的最小方差)

    注意初始化...等等补 #include<bits/stdc++.h> #define ll long long using namespace std; ; int q[maxn],he ...

  2. BZOJ.4072.[SDOI2016]征途(DP 斜率优化)

    题目链接 题目要求使得下面这个式子最小(\(\mu=\frac{\sum_{i=1}^ma_i}{m}\)是平均数,\(a_i\)为第\(i\)段的和): \[\frac{\sum_{i-1}^m(\ ...

  3. BZOJ 3156: 防御准备( dp + 斜率优化 )

    dp(i)表示处理完[i,n]且i是放守卫塔的最小费用. dp(i) = min{dp(j) + (j-i)(j-i-1)/2}+costi(i<j≤N) 然后斜率优化 ------------ ...

  4. BZOJ4518: [Sdoi2016]征途(dp+斜率优化)

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1875  Solved: 1045[Submit][Status][Discuss] Descript ...

  5. 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1096 首先得到dp方程(我竟然自己都每推出了QAQ)$$d[i]=min\{d[j]+cost(j+ ...

  6. BZOJ 1096: [ZJOI2007]仓库建设(DP+斜率优化)

    [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在 ...

  7. 【BZOJ-3437】小P的牧场 DP + 斜率优化

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 705  Solved: 404[Submit][Status][Discuss ...

  8. BZOJ 1767] [Ceoi2009] harbingers (斜率优化)

    [BZOJ 1767] [Ceoi2009] harbingers (斜率优化) 题面 给定一颗树,树中每个结点有一个邮递员,每个邮递员要沿着唯一的路径走向capital(1号结点),每到一个城市他可 ...

  9. 【BZOJ-1010】玩具装箱toy DP + 斜率优化

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][St ...

随机推荐

  1. 规范化注释 VVDocumenter的使用方法

    很多时候,为了快速开发,很多的技术文档都是能省则省,这个时候注释就变得异常重要,但是每次都要手动输入规范化的注释,着实也麻烦,但有了VVDocumenter,规范化的注释,主需要输入三个斜线“///” ...

  2. PHP提升echo, printf, print, file_put_contents等输出方法的效率

    让ECHO变快, 让PHP的请求处理过程, 尽快结束, 之所以ECHO慢, 是在等待”写数据”成功返回, 那么一个比较简单的办法, 就是打开输出缓存, 编辑php.ini output_bufferi ...

  3. oracle小知识总结

    1,表列的五种约束 not null, unique,primary key, foreign key, check 2,权限分配 grant 权限 on 表 to 用户 3,表和视图的区别 视图是一 ...

  4. 【HTML5+MVC4】xhEditor网页编辑器图片上传

    准备工作: 创建一个MVC项目中,添加好xhEditor插件 相关用法:http://www.cnblogs.com/xcsn/p/4701497.html 注意事项:xhEditor分为v1.1.1 ...

  5. [转]Python 命令行参数和getopt模块详解

    FROM : http://www.tuicool.com/articles/jaqQvq 有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,在Pyt ...

  6. linux numfmt 命令--转换数字

    numfmt SYNOPSIS numfmt [OPTION]... [NUMBER]... DESCRIPTION Reformat NUMBER(s), or the numbers from s ...

  7. shell 使用

    echo -e "1\t2\t3" #-e echo -e "\e[1;31m This is red text \e[0m" #color echo -e & ...

  8. 几种任务调度的 Java 实现方法与比较

    综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺 ...

  9. .clear 万能清除浮动

    html body div.clear, html body span.clear { background: none; border: 0; clear: both; display: block ...

  10. 深入理解python的yield和generator

    原文发表在我的博客主页,转载请注明出处 前言 没有用过的东西,没有深刻理解的东西很难说自己会,而且被别人一问必然破绽百出.虽然之前有接触过python协程的概念,但是只是走马观花,这两天的一次交谈中, ...