斜率优化入门题题单$QwQ$
其实就是这一篇的那个例题帕的大部分题目的题解就写这儿辣,,,
因为都是些基础题不想专门给写题解,,,但是又掌握得差不得不写,,,
麻油办法就写一块儿好辣$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$的更多相关文章
- 斜率优化入门学习+总结 Apio2011特别行动队&Apio2014序列分割&HZOI2008玩具装箱&ZJOI2007仓库建设&小P的牧场&防御准备&Sdoi2016征途
斜率优化: 额...这是篇7个题的题解... 首先说说斜率优化是个啥,额... f[i]=min(f[j]+xxxx(i,j)) ; 1<=j<i (O(n^2)暴力)这样一个式子,首 ...
- hdu3507 Print Article(斜率优化入门)(pascal)
Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique, he s ...
- 【bzoj1010-toy】斜率优化入门模板
dsy1010: [HNOI2008]玩具装箱 [题目描述] 有n个数,分成连续的若干段,每段(假设从第j个到第i个组成一段)的分数为 (X-L)^2,X为j-i+Sigma(Ck) i<=k& ...
- 【DP】斜率优化
斜率优化 入门题:PKU3709 很多人貌似都是做这道题来K斜率优化的,所以看了资料以后还是开始入手吧. 然而还是得跪求大神的程序啊 ORZ ORZ…… 其实理解斜率优化就是会列斜率不等式,还要理解剔 ...
- P2365 任务安排 / [FJOI2019]batch(斜率优化dp)
P2365 任务安排 batch:$n<=10000$ 斜率优化入门题 $n^{3}$的dp轻松写出 但是枚举这个分成多少段很不方便 我们利用费用提前的思想,提前把这个烦人的$S$在后面的贡献先 ...
- BZOJ3156 防御准备(动态规划+斜率优化)
设f[i]为在i放置守卫塔时1~i的最小花费.那么显然f[i]=min(f[j]+(i-j)*(i-j-1)/2)+a[i]. 显然这是个斜率优化入门题.将不与i.j同时相关的提出,得f[i]=min ...
- 【BZOJ-3437】小P的牧场 DP + 斜率优化
3437: 小P的牧场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 705 Solved: 404[Submit][Status][Discuss ...
- hdu 2829 Lawrence(斜率优化DP)
题目链接:hdu 2829 Lawrence 题意: 在一条直线型的铁路上,每个站点有各自的权重num[i],每一段铁路(边)的权重(题目上说是战略价值什么的好像)是能经过这条边的所有站点的乘积之和. ...
- [HNOI2008]玩具装箱TOY(斜率优化)
题目链接 题意:有编号为\(1\cdots N\)的N件玩具,第 i 件玩具经过压缩后变成一维长度为 \(C_i\) .要求在一个容器中的玩具编号是连续的,同时如果将第 i 件玩具到第 j 个玩具放 ...
随机推荐
- @atcoder - CODE FESTIVAL 2017 Final - J@ Tree MST
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 个点,第 i 点有一个点权 Xi,再给定一棵边带权的树 ...
- Vue电商后台管理系统项目第2天-首页添加表格动态渲染数据&分页
0x01.使用Github学习的姿势 基于昨天的内容,今天的内容需要添加几个单文件组件,路由文件也需要做相应的增加,今天重点记录使用Element-UI中的表格组件实现数据动态渲染的实现流程和分页功能 ...
- IDEA使用中文api鼠标提示的设置
最近都在用IDEA来练习,发现有的方面确实比eclipse好用,eclipse里面可添加中文的API 提示,对初期的我帮助很大,但是IDEA却没有找到添加的地方,一直以来还以为不支持这个功能,比较遗憾 ...
- c++中单引号和双引号的区别
在C++中单引号表示字符,双引号表示字符串. 例如 :在定义一个数组的时候string a [5]={"nihao","henhao","good&q ...
- 阿里云CDN技术掌舵人文景:相爱相杀一路狂奔的这十年
导读:提到阿里云CDN,不得不提技术掌舵人姚伟斌(文景),虽然他不是团队中最“老”的同学,但他却历经了淘宝业务发展最为飞速的几年,见证了从最初服务淘宝和集团内部的CDN,到如今国内服务客户最多的云CD ...
- adam调参
微调 #阿尔法 "learning_rate": 3e-5, #学习率衰减 "weight_decay": 0.1,// "weight_decay& ...
- gensim的word2vec如何得出词向量(python)
首先需要具备gensim包,然后需要一个语料库用来训练,这里用到的是skip-gram或CBOW方法,具体细节可以去查查相关资料,这两种方法大致上就是把意思相近的词映射到词空间中相近的位置. 语料库t ...
- xml path 列转行实例
SQL Server2005提供了一个新查询语法——For XML PATH(''),这个语法有什么用呢?想象一下这样一个查询需求:有两个表,班级表A.学生表B,要查询一个班级里有哪些学生?针对这个需 ...
- vue用法父组件调用子组件方法--->$refs
vue下载excel模板(放入弹框独立出来)后再导入表格 子组件 <el-dialog title="导入" :visible.sync="dialogVisibl ...
- Python--day38---进程间通信--初识队列(multiprocess.Queue)
初识队列: 进程间通信IPC(Inter-Process Communication) 1,队列的方法: q = Queue(5)1,q.put(1) #把1放进队列 2,print(q.full() ...