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

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

麻油办法就写一块儿好辣$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. ocilib linux编译安装

    1.首先下载ocilib到自己目录 github:https://github.com/vrogier/ocilib 2.在下载instantclient 11.2.2的文件: instantclie ...

  2. ExecutorService小试牛刀

    现在的项目中有将学生批量加入课程的需求,于是想根据这个需求测试一下ExecutorService的效率.假设一个场景:现在有100门课,1500名学生,要求每15个人加入一门课程,不重复. 查询并拼接 ...

  3. 2019-8-31-dotnet-通过-WMI-获取系统信息

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

  4. @codeforces - 1096G@ Lucky Tickets

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 已知一个数(允许前导零)有 n 位(n 为偶数),并知道组成这个 ...

  5. AtCoder Beginner Contest 078 D ABS

    光做C了,做完C,就要结束了,看了看D,没看懂那操作啥意思,就扔了. 刚才看了看,突然懂了.. 就是每个人从那堆牌上边拿牌,最少拿一张,最多可以全拿走,然后手里留下最后一张拿到的,其余的都扔掉. 比如 ...

  6. H3C ICMP

  7. PHP 试题(1)

    1.__FILE__表示什么意思?(5分)文件的完整路径和文件名.如果用在包含文件中,则返回包含文件名.自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一 ...

  8. js实现开关灯游戏

    需求: 点击三个按钮,页面出现不同数量的“灯” 所有的灯有相同的点击效果.点击一个灯的时候,this和他的上下左右都会变成另一种背景色. 代码在这里~~~ 文章地址 https://www.cnblo ...

  9. Centos下添加用户到用户组

    将一个用户添加到用户组中,千万不能直接用: usermod -G groupA 这样做会使你离开其他用户组,仅仅做为 这个用户组 groupA 的成员. 应该用 加上 -a 选项: usermod - ...

  10. PHP 面试题 一

    1.用PHP打印出前一天的时间格式是2017-5-10 22:21:21(2分) 月,日没有前导零:2017-5-1 22:21:21echo date("Y-n-j H:i:s" ...