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

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

麻油办法就写一块儿好辣$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. 权重衰减(weight decay)与学习率衰减(learning rate decay)

    本文链接:https://blog.csdn.net/program_developer/article/details/80867468“微信公众号” 1. 权重衰减(weight decay)L2 ...

  2. C# Find vs FirstOrDefault

    本文告诉大家,在获得数组第一个元素时,使用哪个方法性能更高. 需要知道,两个方法都是 Linq 的方法,使用之前需要引用 Linq .对于 List 等都是继承可枚举Enumerable这时获取第一个 ...

  3. HZOJ 那一天我们许下约定

    比较好想的一道题,只是那个组合数比较恶心. 先说一下我最开始想的$n^4$的沙雕dp: 设f[i][j][k]为前i天给了j个,第i天给了k个,则f[i][j][k]=∑f[i-1][j-k][o]; ...

  4. 第三期 行为规划——11.在C ++中实现第二个成本函数

    在大多数情况下,单一成本函数不足以产生复杂的车辆行为.在这个测验中,我们希望您在C ++中实现更多的成本函数.我们稍后会在本课中使用这两个C ++成本函数.这个测验的目标是创建一个成本函数,使车辆在最 ...

  5. Timer更新UI的合理办法

    using System; using System.Windows; using System.Timers; using System.Windows.Threading; namespace T ...

  6. pytorch JIT浅解析

    概要  Torch Script中的核心数据结构是ScriptModule. 它是Torch的nn.Module的类似物,代表整个模型作为子模块树. 与普通模块一样,ScriptModule中的每个单 ...

  7. H3C 早期以太网技术介绍

  8. vue+file-saver+xlsx导出table表格为excel

    https://blog.csdn.net/wjswangjinsheng/article/details/91393396

  9. 洛谷P2486 [SDOI2011]染色 题解 树链剖分+线段树

    题目链接:https://www.luogu.org/problem/P2486 首先这是一道树链剖分+线段树的题. 线段树部分和 codedecision P1112 区间连续段 一模一样,所以我们 ...

  10. 洛谷P5020 货币系统 题解 模拟

    题目链接:https://www.luogu.org/problem/P5020 这道题目是一道模拟题,但是又有一点多重背包的思想在里面. 首先我们定义一个 vis[i] 来表示和为 i 的情况在之前 ...