OJ题号:
  BZOJ1010

思路:
  斜率优化动态规划。
  由题意得状态转移方程为$f_i=\displaystyle{\min_{j=0}^{i-1}}\{f_j+\left(i-j-1+\displaystyle{\sum_{k=j+1}^i}c_k-L\right)^2\}$。
  用$a_i$表示$c_i$的前缀和,则原式为$f_i=\displaystyle{\min_{j=0}^{i-1}}\{f_j+\left(i-j-1+a_i-a_j-L\right)^2\}$。
  考虑现在有两个状态$j$和$k$都可以转移到$i$。
  假设$j$比$k$更优,则有:$f_j+\left(i-j-1+a_i-a_j-L\right)^2<f_k+\left(i-k-1+=a_i-a_k-L\right)^2$。
  将与$i$有关的项提取出来,设$x=i-1+a_i-L$。
  则原式变为$f_j+\left(x-j-a_j\right)^2<f_k+\left(x-k-a_k\right)^2$。
  化简得$f_j+\left(j+a_j\right)^2-f_k-\left(k+a_k\right)^2<2x(j+a_j-k-a_k)$。
  即$\frac{f_j+\left(j+a_j\right)^2-f_k-\left(k+a_k\right)^2}{(j+a_j-k-a_k)}<2x$。
  对于状态$j<k<l$,若要使$k$为一个有用的状态,则有$\frac{f_k+(k+a_k)^2-f_j-(j+a_j)^2}{2(k+a_k-j-a_j)}<x\leq\frac{f_l+(l+a_l)^2-f_k-(k+a_k)^2}{2(l+a_l-k-a_k)}$。
  然后我们可以维护一个单调队列,使队列中的相邻元素的斜率单调递增。
  每当插入一个元素时,我们比较队列前端两个元素的斜率是否小于$x$,如果是,则将第一个元素弹出队列。
  这时候队列前端的元素一定是最优的一个状态。
  然后尝试将这个元素加入队列,为了保证队列中相邻元素之间的斜率单调递增,每次比较队列后端两个元素的斜率$x1$和队列最末端元素与当前元素$i$的斜率$x2$。
  如果$x1>x2$,即新加入元素后不满足单调性,则将队列末端元素弹出。
  由于每个元素最多只会进队一次,最后的时间复杂度是$O(n)$的。

 #include<cstdio>
#include<cctype>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=;
int n,l,a[N]={},q[N]={},h=,t=;
long long f[N]={};
inline long long sqr(const long long x) {
return x*x;
}
inline double slope(const int &j,const int &k) {
return double(f[j]+sqr(j+a[j])-f[k]-sqr(k+a[k]))/double(j+a[j]-k-a[k]);
}
inline bool check(const int &i,const int &j,const int &k) {
return slope(k,j)>*(i+a[i]-l-);
}
inline bool check2(const int &i,const int &j,const int &k) {
return slope(j,i)<slope(k,j);
}
int main() {
n=getint(),l=getint();
for(register int i=;i<=n;i++) {
a[i]=a[i-]+getint();
while(h<t&&!check(i,q[h],q[h+])) h++;
const int &j=q[h];
f[i]=f[j]+sqr(i-j-+a[i]-a[j]-l);
while(h<t&&!check2(q[t-],q[t],i)) t--;
q[++t]=i;
}
printf("%lld\n",f[n]);
return ;
}

[HNOI2008]玩具装箱的更多相关文章

  1. BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

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

  2. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

    1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...

  3. 【bzoj1010】[HNOI2008]玩具装箱toy

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

  4. 【BZOJ 1010】 [HNOI2008]玩具装箱toy (斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9330  Solved: 3739 Descriptio ...

  5. bzoj 1010 [HNOI2008]玩具装箱toy(DP的斜率优化)

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

  6. BZOJ 1010 [HNOI2008]玩具装箱toy

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

  7. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 11893  Solved: 5061[Submit][S ...

  8. P3195 [HNOI2008]玩具装箱TOY(斜率优化dp)

    P3195 [HNOI2008]玩具装箱TOY 设前缀和为$s[i]$ 那么显然可以得出方程 $f[i]=f[j]+(s[i]-s[j]+i-j-L-1)^{2}$ 换下顺序 $f[i]=f[j]+( ...

  9. [luogu P3195] [HNOI2008]玩具装箱TOY

    [luogu P3195] [HNOI2008]玩具装箱TOY 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆, ...

  10. cogs 1330 [HNOI2008]玩具装箱toy

    cogs 1330 [HNOI2008]玩具装箱toy 瞎扯,急忙AC的请跳过 感觉数据结构写的太多了有点晕=+ 发现还没学斜率优化+- 于是来学一学QwQ 上次这题打了个决策优化直接水过了..理论O ...

随机推荐

  1. jQuery和Prototype的兼容性和冲突的五种解决方法

    第一种情况:先加载Prototype,再加载jQuery方法一:jQuery 库和它的所有插件都是在jQuery名字空间内的,包括全局变量也是保存在jQuery 名字空间内的. 使用jQuery.no ...

  2. Imperva正则表达式的添加以及使用

    Imperva正则表达式的添加以及使用 1.添加字典 创建策略 模拟访问产生告警

  3. 使用dork脚本来查询Google

    使用dork脚本来查询Google 了解Google Hacking数据库的第一步是了解所有典型的Google运算,就像机器级编程工程师必须了解计算机操作代码一样. 这些Google运算是Google ...

  4. 修改类不用重启Tomcat加载整个项目

    可以修改类不用重启Tomcat加载整个项目(手工启动) 配置reloadable=true(自动重载) 使用Debug模式,前提是仅限于局部修改.(修改类不用重启--热加载) Tomcat轻小,而We ...

  5. ParameterizedType获取java泛型参数类型

    ParameterizedType getClass().getGenericSuperclass() 返回表示此 Class 所表示的实体(类.接口.基本类型或 void)的直接超类的 Type,然 ...

  6. 简单的UDP接受程序

    //功能:客服端发送UDP包,服务器接受到并打印出来//2015.9.13成功 #include <stdio.h>#include <sys/socket.h>#includ ...

  7. 窗口启用/禁用功能函数EnableWindow的使用

    在非MFC环境中如何使控件或者窗口禁用呢?起初是想通过发送消息来实现,但找来找去都木有找到控件禁用的消息(也是是博主木有找到的缘故),所以只能另辟蹊径,使用 EnableWindow这个函数, 该函数 ...

  8. 洛谷P2194HXY烧情侣

    传送门啦 这个题可以说是tarjan强连通分量的裸题,但需要维护每个强连通分量的最小值,所以做法就很明确了. 我们先明确几个数组的意思: 1.首先是tarjan缩点中的几个数组: dfn[i]:i点的 ...

  9. Django基础 - 修改默认SQLite3数据库连接为MySQL

    Django数据库连接默认为SQLite3,打开setting.py可以看到数据库部分的配置如下: DATABASES = { 'default': { 'ENGINE': 'django.db.ba ...

  10. Unix IPC之FIFO

    #include "unpipc.h" #define FIFO1 "/tmp/fifo.1" #define FIFO2 "/tmp/fifo.2& ...