题面

搞了一晚上斜率优化,大概懂了一点,写写

原来常用的优化dp方法:做前缀和,预处理,数据结构维护

现在有转移方程长这样的一类dp:$dp[i]=min(dp[i],k[i]*x[j]+y[j]+c[i]+a)$,其中$c[i],k[i],x[j],y[j]$都是关于$i$或者$j$的变量,在$i$或者$j$确定时不变,$a$是个常量

然后发现$x[j]$带着一个$k[i]$的系数,不好优化

从另一个角度考虑,想想高中老师教给我们的线性规划

可以发现因为对于每次转移的$i$来说$c[i],k[i]$都不变,我们可以把$k[i]*x[j]+y[j]$看做是一条直线(初中的一次函数),$k[i]$是斜率,然后$x[j]$是横坐标,$y[j]$是纵坐标,别的都是关于$i$的变量或者常量,不用管。那么实际上我们求的$dp$数组的最终结果就是这条直线的截距的最值(初中的与y轴的交点)

然后我们发现发现对于每个下标我们都可以依照上面的$x[j],y[j]$把它表示成平面上的一个点$(x,y)$,然后这些点会形成一个点集,根据线性规划的知识,可以发现根据斜率的正/负我们的最优决策点都在下/上凸包上,于是可以优化了

当我们每次转移用到的斜率单调时,直接用单调队列维护凸包,先把斜率大/小的都踢掉,转移之后再把现在不在凸包上的点也都踢掉,最后把当前点加进去

当我们每次转移用到的斜率不单调时,就不能根据斜率直接踢了,但仍然用单调队列维护凸包,只是把找最优决策点用二分代替

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=50005;
 6 long long len[N],dp[N],que[N],n,x,f,b;
 7 inline long long c1(int p){return len[p]+p;}
 8 inline long long c2(int p){return c1(p)+x+1;}
 9 inline long long K(int p){return 2*c1(p);}
10 inline long long X(int p){return c2(p);}
11 inline long long Y(int p){return c2(p)*c2(p)+dp[p];}
12 inline long long S(int a,int b){return (double)(Y(b)-Y(a))/(double)(X(b)-X(a));}
13 int main()
14 {
15     scanf("%lld%lld",&n,&x);
16     for(int i=1;i<=n;i++)
17         scanf("%lld",&len[i]),len[i]+=len[i-1];
18     que[f=b=0]=0;
19     for(int i=1;i<=n;i++)
20     {
21         while(b-f>=1&&S(que[f],que[f+1])<K(i)) f++;
22         dp[i]=dp[que[f]]+(c1(i)-c2(que[f]))*(c1(i)-c2(que[f]));
23         while(b-f>=1&&S(que[b-1],i)<S(que[b],que[b-1])) b--; que[++b]=i;
24     }
25     printf("%lld",dp[n]);
26     return 0;
27 }

View Code

转载于:https://www.cnblogs.com/ydnhaha/p/10004299.html

解题:HNOI 2008 玩具装箱相关推荐

  1. 【决策单调性】玩具装箱(金牌导航 决策单调性优化DP-1)

    玩具装箱 金牌导航 决策单调性优化DP-1 题目大意 给出若干个物品,把iii到jjj个物品装在一起的长度l=j−i+∑k=ijakl=j-i+\sum_{k=i}^{j}a_kl=j−i+∑k=ij ...

  2. 【斜率优化】玩具装箱(luogu 3195)

    玩具装箱 luogu 3195 题目大意 有n件物品,每件物品有相对的长度CiC_iCi​现在要把这n件物品放到容器中,切放的物品必须是连续的,若把第i件物品到第j件物品放到一个容器中,那此容器的长度 ...

  3. 『玩具装箱TOY 斜率优化DP』

    玩具装箱TOY(HNOI2008) Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...

  4. [HNOI2008]玩具装箱toy

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 10286  Solved: 4215 [Submit] ...

  5. 【BZOJ1010】【HNOI2008】玩具装箱(斜率优化,动态规划)

    [BZOJ1010][HNOI2008]玩具装箱 题面 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一 ...

  6. bzoj 1010: [HNOI2008]玩具装箱toy 2011-12-27

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2254  Solved: 744 [Submit][S ...

  7. 1010 [HNOI2008]玩具装箱toy

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Description P教授要去看奥运,但是他舍不下他的玩具,于是他决 ...

  8. P3195 [HNOI2008]玩具装箱TOY

    P3195 [HNOI2008]玩具装箱TOY 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的 ...

  9. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 11893  Solved: 5061 [Submit] ...

最新文章

  1. Android替换view父节点,android – issue:指定的子节点已经有父节点.您必须首先在孩子的父母上调用removeView()...
  2. Google的预训练模型又霸榜了,这次叫做T5(附榜单)
  3. 我是如何在SQLServer中处理每天四亿三千万记录的
  4. 43 inventory文件
  5. MySQL的索引存储数据结构BTree和B+Tree的区别
  6. Dev TextEdit 输入提示
  7. 熊猫多模式站群 模型handlers流程图
  8. epic打开一直闪_教你用意派Epub360做酷炫的快闪H5!(附快闪H5模板)
  9. 实例化vue发生了什么?(详解vue生命周期)
  10. 意图识别 聊天机器人_如何解决聊天机器人中的意图冲突
  11. Arduino U8glib库中的中文字体
  12. 智慧环卫管理系统解决方案
  13. 在Mac电脑的输入法中如何开启自动纠正模糊拼音功能?
  14. Latex表格内容自动换行
  15. MySQL聚集索引和非聚集索引
  16. 沁恒微电子CH347是一款高速USB总线转接芯片
  17. springboot程序logback日志基本配置,多个包不同日志级别输入到文件中
  18. 聚焦:ZK-SNARK 技术
  19. win7/win10上安装谷歌官方无广告的安卓模拟器 - Android Studio - 下载安装AVD虚拟机
  20. python + openpyxl 输出Excel单元格大小自适应和填充

热门文章

  1. 并发服务器模型——多进程服务器
  2. google map的简单二次开发
  3. 漫步线性代数十六——投影和最小二乘
  4. 不可重复读和幻读的区别_图解脏写、脏读、不可重复读、幻读
  5. python最小公倍数 菜鸟_Python实现的求解最小公倍数算法示例
  6. 由相机的自身参数求解内参矩阵
  7. VC2008以资源形式实现多语言版本
  8. JDBC简单连接MySQL
  9. 【实践驱动开发2-001】wifi 在android 下的实现 - AR6000 系列移植详细步骤
  10. 趋势科技云安全软件_阿里达摩院发布2020十大科技趋势!量子计算、类脑计算系统崛起...