其实就是这一篇的那个例题帕的大部分题目的题解就写这儿辣,,,

因为都是些基础题不想专门给写题解,,,但是又掌握得差不得不写,,,

麻油办法就写一块儿好辣$QwQ$

当然辣比较难的我就没放进来辣$QwQ$

[X]玩具装箱

解析在上一篇就港辣_(:з」∠)_

懒得复制辣,就只放个代码了昂$QwQ$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define lf double
#define gc getchar()
#define int long long
#define mp make_pair
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=+;
int n,l,sum[N],stck[N],head=,tail=,f[N],A[N],B[N]; il int read()
{
ri x=;rb y=;rc ch=gc;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int sqr(ri x){return 1ll*x*x;}
il lf X(ri x){return B[x];}
il lf Y(ri x){return f[x]+sqr(B[x]);}
il lf slope(ri i,ri j){return (Y(i)-Y(j))/(X(i)-X(j));} main()
{
freopen("3195.in","r",stdin);freopen("3195.out","w",stdout);
n=read();l=read();rp(i,,n)sum[i]=sum[i-]+read(),A[i]=sum[i]+i,B[i]=sum[i]+i+l+;B[]=l+;
rp(i,,n)
{
while(head<tail && slope(stck[head],stck[head+])<*A[i])++head;f[i]=f[stck[head]]+sqr(A[i]-B[stck[head]]);
while(head<tail && slope(stck[tail-],i)<slope(stck[tail-],stck[tail]))--tail;stck[++tail]=i;
}
printf("%lld\n",f[n]);
return ;
}

[X]防御准备

先考虑无优化的$dp$呗

设$f_{i}$表示第$i$个放路灯的最小花费,转移就$f_{i}=(f_{j}+\frac{(i-j+1)*(i-j)}{2}+)_{min}$

显然复杂度不对,于是考虑斜率优化.

先拆式子,$2\cdot f_{i}=(2\cdot f_{j}+i^{2}-2\cdot i\cdot j+j^{2}+i+j)_{min}+2\cdot a_{i}$

先把$min$搞掉,变形下就是$2\cdot f_{j}+j^{2}+j=2\cdot i\cdot j-i^{2}-2\cdot f_{i}-2\cdot a_{i}-i$

显然考虑设$2\cdot f_{j}+j^{2}+j=y,2\cdot i=k,j=x,b=-1-i^{2}+2\cdot f_{i}-2\cdot a_{i}$

然后求$min$就下凸壳昂,然后就做完辣,,,?$QwQ$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define lf double
#define gc getchar()
#define int long long
#define mp make_pair
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=1e6+,inf=1e9;
int n,stck[N],head,tail,f[N],a[N]; il int read()
{
ri x=;rb y=;rc ch=gc;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int sqr(ri x){return 1ll*x*x;}
il lf X(ri x){return (lf)x;}
il lf Y(ri x){return (lf)*f[x]+sqr(x)+x;}
il lf slope(ri i,ri j){return (Y(i)-Y(j))/(X(i)-X(j));} signed main()
{
//freopen("3156.in","r",stdin);freopen("3156.out","w",stdout);
n=read();rp(i,,n)a[i]=read();//f[0]=inf;f[1]=a[1];stck[++tail]=1;
rp(i,,n)
{
while(head<tail && slope(stck[head],stck[head+])<*i)++head;
ri j=stck[head];f[i]=f[j]+(i-j-)*(1ll*i-j)/+a[i];
while(head<tail && slope(stck[tail-],i)<slope(stck[tail-],stck[tail]))--tail;stck[++tail]=i;
}
printf("%lld\n",f[n]);
return ;
}

嗷想港个小$tip$

这样的,因为开始看到题的$gql$太$naive$了,并没有意识到左边右边其实是一样儿的,就想着,先翻转过来

然后翻转过来之后发现会麻烦一些(因为会有强制第一个选这种以及最后一个可以不选这种问题,,,

于是我就又换回正序辽,,,就想提醒下不要倒叙走,,,会麻烦很多我感觉$QAQ$

[ ]序列分割

开始看感觉长得很区间$dp$的样子,,,然后就显然无法优化,$O(n^{2})$50$pts$滚粗了嘤嘤嘤

这里要先证明一个性质,就说切割的顺序并不影响最终的结果

下证

显然只要证明切两刀时的顺序不影响结果就能用数学归纳法得切若干刀都不影响结果嘛

于是考虑证切两刀时的顺序不影响结果

设切两刀得到的三块分别为$a_{1},a_{2},a_{3}$

则对于先切开左边再切右边是$as=a_{1}\cdot (a_{2}+a_{3})+a_{2}\cdot a_{3}=a_{1}\cdot a_{2}+a_{2}\cdot a_{3}+a_{1}\cdot a_{3}$

然后对于先切开右边再切左边是$as=a_{3}\cdot (a_{2}+a_{1})+a_{2}\cdot a_{1}=a_{1}\cdot a_{2}+a_{2}\cdot a_{3}+a_{1}\cdot a_{3}$

得证!

欧克然后接下来就可以考虑用线性$dp$直接枚举在哪儿切就好嘛$QwQ$

设$f_{i,j}$表示在$i$的左处切了一刀,共切了$j$刀时的$max$,有$f_{i,j}=(f_{k,j-1}+\sum_{p=k+1}^{i-1}a_{p}\cdot \sum_{p=i}^{n}a_{p})_{max}$

这时候复杂度是$O(n^{2}\cdot k)$,显然过不去昂.考虑优化到$O(n\cdot k)$就欧克了嘛$QwQ$

先把$j$这一维省略,因为并不需要优化它,显然只要让它在最外层循环就不会打扰到内部的转移辣$QwQ$

于是转移式就再变形了下$QwQ$

$f_{i}=(f_{k}+(sum_{i-1}-sum_{k})\cdot (sum_{n}-sum_{i-1}))_{max}$

因为$sum_{n}$是常量,为了避免误会,令$sum_{n}=S$

日常考虑删$max$咯

$f_{i}=f_{j}+sum_{i-1}\cdot S-sum_{i}^{2}-sum_{k}\cdot S+sum_{j}\cdot sum_{i-1}$

$f_{j}=-sum_{i-1}\cdot sum_{j}+f_{i}-sum_{i-1}\cdot S+sum_{i}^{2}$

于是就设$f_{j}=y,-sum_{i-1}=k,sum_{j}=x,f_{i}-sum_{i-1}\cdot S+sum_{i}^{2}=b$

$max$于是考虑上凸壳昂,然后应该就差不多辣,,,?$QwQ$

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define lf double
#define gc getchar()
#define int long long
#define mp make_pair
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=1e6+,inf=1e9,M=+;
int n,stck[N],head,tail,f[N],g[N],sum[N],K,pre[N][M]; il int read()
{
ri x=;rb y=;rc ch=gc;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int sqr(ri x){return 1ll*x*x;}
il lf X(ri x){return (lf)sum[x];}
il lf Y(ri x){return (lf)g[x];}
il lf slope(ri i,ri j){return (lf)(Y(i)-Y(j))/(X(i)-X(j));} signed main()
{
//freopen("3648.in","r",stdin);freopen("3648.out","w",stdout);
n=read();K=read();rp(i,,n)sum[i]=read()+sum[i-];
rp(k,,K)
{
head=tail=;
rp(i,k-,n)
{
while(head<tail && slope(stck[head],stck[head+])>-sum[i-])++head;
ri j=stck[head];f[i]=g[j]+(sum[i-]-sum[j])*(sum[n]-sum[i-]);pre[i][k]=j;
while(head<tail && slope(stck[tail-],i)>slope(stck[tail-],stck[tail]))--tail;stck[++tail]=i;
}
rp(i,k-,n)g[i]=f[i];
}
ri tmp=n;rp(i,,n)if(f[i]>f[tmp])tmp=i;printf("%lld\n",f[tmp]);my(i,K,)printf("%lld ",tmp=pre[tmp][i]);
return ;
}
/*fi=(fk+(sumi−1−sumk)⋅(sumn−sumi−1))max*/
/*fj=y,−sumi−1=k,sumj=x,fi−sumi−1⋅S+sum2i=b*/

没写完,,,存个半成品先$QAQ$

[ ]土地购买

[ ]仓库建设

[ ]任务安排

[ ]特别行动队

[ ]BZOJ3437

[ ]BZOJ4518

斜率优化入门题题单$QwQ$的更多相关文章

  1. 斜率优化入门学习+总结 Apio2011特别行动队&Apio2014序列分割&HZOI2008玩具装箱&ZJOI2007仓库建设&小P的牧场&防御准备&Sdoi2016征途

    斜率优化: 额...这是篇7个题的题解... 首先说说斜率优化是个啥,额... f[i]=min(f[j]+xxxx(i,j)) ;   1<=j<i (O(n^2)暴力)这样一个式子,首 ...

  2. hdu3507 Print Article(斜率优化入门)(pascal)

    Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique, he s ...

  3. 【bzoj1010-toy】斜率优化入门模板

    dsy1010: [HNOI2008]玩具装箱 [题目描述] 有n个数,分成连续的若干段,每段(假设从第j个到第i个组成一段)的分数为 (X-L)^2,X为j-i+Sigma(Ck) i<=k& ...

  4. 【DP】斜率优化

    斜率优化 入门题:PKU3709 很多人貌似都是做这道题来K斜率优化的,所以看了资料以后还是开始入手吧. 然而还是得跪求大神的程序啊 ORZ ORZ…… 其实理解斜率优化就是会列斜率不等式,还要理解剔 ...

  5. P2365 任务安排 / [FJOI2019]batch(斜率优化dp)

    P2365 任务安排 batch:$n<=10000$ 斜率优化入门题 $n^{3}$的dp轻松写出 但是枚举这个分成多少段很不方便 我们利用费用提前的思想,提前把这个烦人的$S$在后面的贡献先 ...

  6. BZOJ3156 防御准备(动态规划+斜率优化)

    设f[i]为在i放置守卫塔时1~i的最小花费.那么显然f[i]=min(f[j]+(i-j)*(i-j-1)/2)+a[i]. 显然这是个斜率优化入门题.将不与i.j同时相关的提出,得f[i]=min ...

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

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

  8. hdu 2829 Lawrence(斜率优化DP)

    题目链接:hdu 2829 Lawrence 题意: 在一条直线型的铁路上,每个站点有各自的权重num[i],每一段铁路(边)的权重(题目上说是战略价值什么的好像)是能经过这条边的所有站点的乘积之和. ...

  9. [HNOI2008]玩具装箱TOY(斜率优化)

    题目链接 题意:有编号为\(1\cdots N\)的N件玩具,第 i 件玩具经过压缩后变成一维长度为 \(C_i\)​ .要求在一个容器中的玩具编号是连续的,同时如果将第 i 件玩具到第 j 个玩具放 ...

随机推荐

  1. Linxu 用户和用户组管理1

    Linux 系统是一个多用户任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后 以这个账号的身份进入系统. 用户的账号一方面可以帮助系统管理员对使用系统的用户进 ...

  2. 10-2 body标签中相关的标签(字体标签,排版标签(div,span),超链接,图片标签)

    一 排版标签(div,span) 1块级标签 <!--div:把标签中的内容作为一个块儿来对待(division).必须单独占据一行.--> <!--div标签的属性:--> ...

  3. 在VirtualBox下安装linux操作系统

    目标:在linux服务器上部署Java开发的网站 工具 VirtualBox-4.3.8:下载后安装. linux系统镜像: Centos国内镜像文件下载地址: http://centos.ustc. ...

  4. Laravel引入第三方库的方法

    https://blog.csdn.net/will5451/article/details/52472695 1.首先在app目录下创建一个新的文件夹,命名libs(可自定义) 2.(可选)考虑到后 ...

  5. pytorch 动态调整学习率 重点

    深度炼丹如同炖排骨一般,需要先大火全局加热,紧接着中火炖出营养,最后转小火收汁.本文给出炼丹中的 “火候控制器”-- 学习率的几种调节方法,框架基于 pytorch 1. 自定义根据 epoch 改变 ...

  6. 2019-8-31-PowerShell-通过-WMI-获取系统信息

    title author date CreateTime categories PowerShell 通过 WMI 获取系统信息 lindexi 2019-08-31 16:55:58 +0800 2 ...

  7. 微信小程序wx.request POST获取不到数据解决办法

    get //发起请求     wx.request({       url: 'http://www.xiaochengxu.com/home/index/curd', //仅为示例,并非真实的接口地 ...

  8. Python--day23--组合

  9. Python--day22--面向对象的交互

    Python里面自带的类和对象: 类名的作用: 类里面的与属性相关的对象self的运用: 实例化:就是创建一个对象 调用方法,类名.方法名(对象名) 执行步骤: 简写:alex.walk()等价于Pe ...

  10. 困扰的问题终于解决了-docker时区不正确的问题修改记

    前一阵子有一台服务器,mysql的时间比北京时间晚了8个小时.我知道是时区的问题,但是不知道为什么弄成这样,宿主机没有问题,后来一看mysql的docker,时区是错的. mybatis-plus打印 ...