cogs 1330 [HNOI2008]玩具装箱toy


瞎扯,急忙AC的请跳过

感觉数据结构写的太多了有点晕=+

发现还没学斜率优化+
-

于是来学一学QwQ

上次这题打了个决策优化直接水过了。。理论O(n^2)


蒯个链接

来推一推~

设f[i]为搞定区间1~i的答案。

推出转移方程:

\[f[i]=min(f[j]+(s_i-s_j+i-j-1-L)^2) (j\in[0,i-1])
\]

其中\(s_i\)为\(\sum_{j=1}^{i}C_j\)

这里优化一下:\(s_i\)表示\(i+\sum_{j=1}^{i}C_j\),转移方程简化为

\[f[i]=min(f[j]+(s_i-s_j-1-L)^2) (j\in[0,i-1])
\]

其实没那个必要优化,只是看着爽

然后,\(s_i-1-L\)只和\(i\)有关,\(-s_j\)只和j有关。一次转移中\(i\)是不会变的,\(s_i-1-L\)也是不会变的。

令\(X=s_i-1-L\).

\(f[i]=min(f[j]+(X-s_j)^2)\)

\(\ \ \ \ \ \ =min(f[j]+X^2+s_j^2-2Xs_j)\)

那个\(X^2\)与\(j\)毫无关联,完全可以提出来。

\(\ \ \ \ \ \ =min(f[j]+s_j^2-2Xs_j)+X^2\)

换一个角度:一个\(j\)会转移给不同的\(i\),转移过程中\(f[j]+s_j^2\)不会改变,改变的只有\(-2Xs_j\)

然后,由于\(X\)的不同,转移过去的值也不同。

这个值其实是个一次函数\(y=-2Xs_j+f[j]+s_j^2\).

把\(-2s_j\)看成\(k\),把\(f[j]+s_j^2\)看成\(b\).

画出笛卡尔平面直角坐标系。

(自行脑补,懒得画了)

有一些线是不需要的,因为x取什么值,它都取不到最小,可以删除

然后维护一个单调队列放所有的线

可以发现\(k\)单调递减,\(x\)单调递增,所以很好维护,如果队首答案>队首+1答案直接hd++,懒得证。

怎么维护真的懒得写了。。。下凸壳的左半部分

然后直接上代码吧?

感觉是最详细的一篇博客了

// It is made by XZZ
#include<cstdio>
#include<algorithm>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
#define db double
typedef long long ll;
il int gi(){
rg int x=0,f=1;rg char ch=getchar();
while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int maxn=50001;
ll s[maxn],f[maxn];
struct line{ll k,b;};
struct point{db x,y;};
il point javascript(const line&a,const line&b){
static point ret;
ret.x=(a.b-b.b)/(db)(a.k-b.k);
ret.y=ret.x*a.k+a.b;
return ret;
}
line que[maxn];int hd,tl;
int main(){
int n=gi();ll l=gi();
rep(i,1,n)s[i]=gi()+s[i-1];
rep(i,1,n)s[i]+=i;
f[0]=0;
hd=0,tl=-1;
que[++tl]=(line){0,0};
rep(i,1,n){
static ll x;x=s[i]-l-1;
while((tl^hd)&&que[hd].k*x+que[hd].b>que[hd+1].k*x+que[hd+1].b)++hd;
f[i]=que[hd].k*x+que[hd].b+x*x;
static line ls;ls=(line){-2*s[i],f[i]+s[i]*s[i]};
while((tl^hd)&&javascript(ls,que[tl]).x>javascript(ls,que[tl-1]).x)--tl;
que[++tl]=ls;
}
printf("%lld\n",f[n]);
return 0;
}

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

  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教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆, ...

随机推荐

  1. 剑指offer 09变态跳台阶

    一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. java版本: public class Solution { public stati ...

  2. 详解权限管理(RBAC)的实现方法

    在说权限管理前,应该先知道权限管理要有哪些功能: ().用户只能访问,指定的控制器,指定的方法 ().用户可以存在于多个用户组里 ().用户组可以选择,指定的控制器,指定的方法 ().可以添加控制器和 ...

  3. LVS 原理(调度算法、四种模式、四层负载均衡和七层 的区别)

    参考文档:http://blog.csdn.net/ioy84737634/article/details/44916241 目录 lvs的调度算法 lvs的四种模式 四层均衡负载和七层的区别 1.l ...

  4. Element对象 常用属性与常用方法

    常用属性 .children 子元素列表 .childElementCount 子元素数量 .firstElementChild 第一个子元素 .lastElementChild 最后一个子元素 .c ...

  5. NLog写入Mongo日志配置

    Web网站中引入了NLog日志,日志记录在Mongo数据库中,经过两天的简单学习,现简要记录说明下: 首先贴出NLog的学习地址: https://github.com/NLog/NLog/wiki/ ...

  6. QT导入libcurl支持HTTPS

    对于我这种不会编译的人来说,必须找到已经编译好的DLL文件,以及头文件才能使用. 幸运的在这个网站https://stackoverflow.com/questions/28137379/libcur ...

  7. MySQL IFNULL基本用法

    MySQL IFNULL函数是MySQL控制流函数之一,它接受两个参数,如果不是NULL,则返回第一个参数. 否则,IFNULL函数返回第二个参数. 两个参数可以是文字值或表达式. 以下说明了IFNU ...

  8. virtualbox+vagrant学习-2(command cli)-9-vagrant Plugin命令

    Plugin 格式: vagrant plugin <command> [<args>] 这是用来管理插件的命令. 1)Plugin Expunge 格式: vagrant p ...

  9. Python自动化之django model验证(很弱,感觉应用场景不多)

    django model的数据验证 使用full_clean进行验证 obj = models.UserInfo(name="alex",email="tiantian& ...

  10. 集合之Iterator

    迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...