P3195 [HNOI2008]玩具装箱TOY

第一道斜率优化题。

首先一个基本的状态转移方程是

要使f[i]最小,即b最小。

对于每个j,可以表示为一个点。

然后我们取固定斜率时截距最小的即可,高中线性规划。

单调队列维护下凸包。

然后每次二分出j,转移。

记得给(0,L * L)赋初值。

记得开long long

++,--最好别随便用,编译器的不同会让你爆0...

  1. #include <cstdio>
  2.  
  3. typedef long long LL;
  4. const int N = ;
  5.  
  6. LL sum[N], g[N], p[N], top;
  7. LL f[N], y[N];
  8.  
  9. inline double slope(int i, int j) {
  10. return ((double)(y[j] - y[i])) / (g[j] - g[i]);
  11. }
  12.  
  13. inline int get(int i) {
  14. if(i == ) {
  15. return ;
  16. }
  17. double k = 2.0 * g[i];
  18. int l = , r = top, mid;
  19. while(l < r) {
  20. mid = (l + r) / ;
  21. //printf("%lf %lf \n", slope(p[mid], p[mid + 1]), k);
  22. if(slope(p[mid], p[mid + ]) < k) {
  23. l = mid + ;
  24. }
  25. else {
  26. r = mid;
  27. }
  28. }
  29. //printf("i = %d r = %d j = %d \n", i, r, p[r]);
  30. return p[r];
  31. }
  32.  
  33. int main() {
  34. //freopen("in.in", "r", stdin);
  35. LL n, L;
  36. scanf("%lld%lld", &n, &L);
  37. L++;
  38. for(int i = ; i <= n; i++) {
  39. LL x;
  40. scanf("%lld", &x);
  41. sum[i] = sum[i - ] + x;
  42. g[i] = i + sum[i];
  43. }
  44. y[] = L * L;
  45. for(int i = ; i <= n; i++) {
  46. // f[i] = f[j] + (g[i] - g[j] - L) ^ 2
  47. int j = get(i);
  48.  
  49. f[i] = f[j] + (g[i] - g[j] - L) * (g[i] - g[j] - L);
  50. y[i] = f[i] + (g[i] + L) * (g[i] + L);
  51. //printf("y[%d] = %d \n", i, y[i]);
  52.  
  53. p[++top] = i;
  54. while(top > && slope(p[top - ], p[top - ]) >= slope(p[top - ], p[top])) {
  55. p[top - ] = p[top];
  56. top--;
  57. }
  58. }
  59.  
  60. /*for(int i = 1; i <= n; i++) {
  61. printf("%lld ", f[i]);
  62. }
  63. puts("");*/
  64. printf("%lld", f[n]);
  65. return ;
  66. }

AC代码

[update20181208]今天又考了一次玩具装箱,发现了一个问题.......怎么能把点的坐标直接带入到斜截式里面啊!!!!

只知道y - y0 = k(x - x0),从来没听过y0 = kx0 + b啊啊啊!!!

关于上面那个的解释:(感谢某蒋姓巨佬为我讲解)

上面那个式子化简为2gi * gj + C = F(j)

考虑有某条直线过点(gj, F(j)),且方程为kx + b = y,其中k = 2gi

那么将点带入,可得:k * gj + b = F(j)

故上面那个等式即为直线的方程。

y - F(j) = 2gi(x - gj)

y - F(j) = 2gi * x - 2gi * gj

然后反正瞎搞一搞就行了啦我也不管了啊啊啊啊阿斜率优化好难啊啊我到底在写什么东西啊

洛谷P3195 玩具装箱的更多相关文章

  1. 洛谷P3195 玩具装箱TOY

    题目大意: 有n个数,要将他们分成若干段,每一段的cost定义为: cost=r-l+ΣCk (k∈[r,l]) 该段的最终花费是:(cost-L)^2; 给出L,n,C(1~n),总共的最小花费. ...

  2. 洛谷P3195||bzoj1010 [HNOI2008]玩具装箱TOY

    洛谷P3195 bzoj1010 设s数组为C的前缀和 首先$ans_i=min_{j<i}\{ans_j+(i-j-1+s_i-s_j-L)^2\}$ (斜率优化dp)参考(复读)https: ...

  3. 洛谷 P3195 [HNOI2008] 玩具装箱

    链接: P3195 题意: 给出 \(n\) 个物品及其权值 \(c\),连续的物品可以放进一个容器,如果将 \(i\sim j\) 的物品放进一个容器,产生的费用是 \(\left(j-i+\sum ...

  4. 洛谷P3195 [HNOI2008] 玩具装箱 [DP,斜率优化,单调队列优化]

    题目传送门 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N ...

  5. 洛谷P3195 [HNOI2008]玩具装箱TOY——斜率优化DP

    题目:https://www.luogu.org/problemnew/show/P3195 第一次用斜率优化...其实还是有点云里雾里的: 网上的题解都很详细,我的理解就是通过把式子变形,假定一个最 ...

  6. 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...

  7. [洛谷P3195][HNOI2008]玩具装箱TOY

    题目大意:有n个物体,大小为$c_i$.把第i个到第j个放到一起,容器的长度为$x=j-i+\sum\limits_{k-i}^{j} c_k$,若长度为x,费用为$(x-L)^2$.费用最小. 题解 ...

  8. 洛谷P3195 [HNOI2008]玩具装箱TOY 斜率优化

    Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 100000 ...

  9. 洛谷 P3195 [HNOI2008]玩具装箱TOY

    题意简述 有n个物体,第i个长度为ci 将n个物体分为若干组,每组必须连续 如果把i到j的物品分到一组,则该组长度为 \( j - i + \sum\limits_{k = i}^{j}ck \) 求 ...

随机推荐

  1. Git SSH公钥配置

    https://www.cnblogs.com/smuxiaolei/p/7484678.html https://blog.csdn.net/weixin_42063071/article/deta ...

  2. rpm和yum

    RMP(红帽软件包管理器) RPM有点像Windows系统中的控制面板,会建立统一的数据库文件,详细记录软件信息并能够自动分析依赖关系. YUM(软件仓库)

  3. Django--权限信息操作

    一 . 权限控制 表结构的设计 rbca(Role Based Access Control)  基于角色的权限控制 3个model  5张表 class User(models.Model): # ...

  4. app自动化测试Appium+python

    一.node.js安装 https://nodejs.org/en/download/ ##一直下一步 ###cmd查看 二.  .NET Framework安装 https://www.micros ...

  5. 转 利用java反射实现两个具有相同属性bean赋值

    package com.dobn.bdgcgl.utils; import java.lang.reflect.Field; import java.lang.reflect.Method; publ ...

  6. Python学习之路—————day04

    今日内容: 1. 循环语句 1.1 if判断 1.2 while循环 1.3 for循环 一.if判断 语法一: if 条件 代码块1 代码块2 代码块3 # 例: sex='female' age= ...

  7. react 粗略使用

    1.首先在index.html页面上写好dom,给他一个id让他引用js里的react. 2.index.js里面的代码就是三步走. 第一步:引用react,各种引用依赖. 第二步:创建dom,但它是 ...

  8. DOSD用scratch的方式训练通用目标检测,性能很高

    推荐一篇今年ICCV上基于DenseNet的general object detection的工作.这是目前已知的第一篇在完全脱离ImageNet pre-train模型的情况下使用deep mode ...

  9. cuda编程-并行规约

    利用shared memory计算,并避免bank conflict:通过每个block内部规约,然后再把所有block的计算结果在CPU端累加 代码: #include <cuda_runti ...

  10. codeforces569B

    Inventory CodeForces - 569B Companies always have a lot of equipment, furniture and other things. Al ...