P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+Σ(Ck) i<=K<=j 制作容器的费用与容器的长度有关,根据教授研究,如果容器长度为x,其制作费用为(X-L)^2.其中L是一个常量。P教授不关心容器的数目,他可以制作出任意长度的容器,甚至超过L。但他希望费用最小

第一行输入两个整数N,L.接下来N行输入Ci.1<=N<=50000,1<=L,Ci<=10^7
输出最小费用

提取信息:
1.n件玩具
2.可以将某段玩具压缩,需要付出代价
3.压缩次数不限
4.要求计算最小费用
我们首先设计状态:
直观的:f[i]表示到了第i件玩具
这时我们发现剩余的2个信息无需也无法在向状态空间中添加,因为压缩次数是不限的,或者说,这样就足够描述状态空间了。
所以我们就用f[i]表示处理到第i件玩具时的最小费用
接着思考转移:
我们能够用来连接转移的信息只有将某段玩具压缩了,所以我们很容易地想到:
设j表示i之前的某个点,我们要压缩j+1到i之间的玩具。
我们再记一个前缀和数组S表示数组C的前缀和
这样我们就能写出状态转移方程
f[i] = min{f[j] + (i - j + S[i] - S[j] - L - 1) ^ 2}
复杂度O(n^2)
肯定无法通过这道题,思考如何优化,首先我们将循环变量i看做一个常量
将min函数去掉,得到
f[i] = f[j] + (i - j + S[i] - S[j] - L - 1)^2
为了方便,我们将多项式分离成: i + S[i]和 j + S[j] + L + 1
用a[i]存储i+S[i],即a[i] = i + S[i],同理:b[i] = i + S[i] + L + 1
这样我们将方程变为
f[i] = f[j] + (a[i] - b[j])^2
==> f[i] = f[j] + a[i]^2 - 2 * a[i] * b[j] + b[j]^2
==> f[j] + b[j]^2 = 2 * a[i] * b[j] + f[i] - a[i]^2
我们将b[j]看做横坐标,2*a[i]看做斜率,f[j] + b[j]^2看做y
这个式子就可以看做以2*a[i]为斜率的直线,纵截距为f[i] - a[i]^2,且截距未知
于是我们很容易能想到,我们要在某个位置取到最优决策,就要求截距最小化
我们很容易看出2*a[i]和f[i] - a[i]^2是常量,而对于自变量b[j]本身具有单调性,所以显然该方程具有决策单调性,所以我们使用斜率优化
对于任意三个决策点(f[j1] + b[j1]^2, b[j]), (f[j2] + b[j2]^2, b[j2]),(f[j3] + b[j3]^2, b[j3]), 设b[j1] < b[j2] < b[j3],若j2为最优决策,则有
f[j1] + b[j1]^2 - b[j1] > f[j2] + b[j2]^2 - b[j2]
同理:f[j2] + b[j2]^2 - b[j2] < f[j3] + b[j3]^2 - b[j3]
可以变形为:f[1] + b[j1]^2 - f[j2] - b[j2]^2 / (b[j1] - b[j2]) > 1
f[j2] + b[j2] ^ 2 - f[j3] - b[j3]^2 / (b[j2] - b[j3]) < 1
也就是说,加入某个中间点j2是最优决策,则必须满足:
f[j1] + b[j1]^2 - f[j2] - b[j2]^2 / (b[j1] - b[j2]) > f[j2] + b[j2] ^ 2 - f[j3] - b[j3]^2 / (b[j2] - b[j3])
//2*a[i]被约分掉了
然后我们可以发现等式两边实际分别表示的是直线j1j2和直线j2j3的斜率
也就是说我们可以通过维护斜率的单调递增来保证每次我们取到的是最优解,也就是维护一个下凸壳
对于下凸壳的维护,我们需要建立一个支持如下操作的单调队列:
1.每次取出队头q[l], q[l + 1],若斜率 (f[q[l]] + b[q[l]]^2 - f[q[l+1]] - b[q[l+1]]^2) / (b[q[l]] - b[q[l+1]]) <= 2 * a[i],则将队头出列,直至不满足
2.此时对于队头,就是当前状态的最优决策,取出队头进行转移
3.检查队尾,对于队尾q[r - 1], q[r],以及新决策i,若不满足斜率单调递增,则出队,直到满足
4.将决策i插入队尾

//可能有部分出入和错误,因为题解太长而我又是记事本写的....

//建议读代码

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define ld long double
  4. #define db double
  5. using namespace std;
  6. const int maxn = ;
  7. ld f[maxn], s[maxn];//, a[maxn], b[maxn];
  8. int n, L;
  9. int l, r, q[maxn];
  10.  
  11. inline ld a(int i) {
  12. return s[i] + i;}
  13.  
  14. inline ld b(int i) {
  15. return a(i) + L + ;}
  16.  
  17. inline ld X(int i) {
  18. return b(i);}
  19.  
  20. inline ld Y(int i) {
  21. return f[i] + b(i) * b(i);}
  22.  
  23. inline ld ask(int i,int j) {
  24. return (Y(i) - Y(j)) / (X(i) - X(j));}
  25.  
  26. int main() {
  27. cin >> n >> L;
  28. for(int i = ; i <= n; ++i) {
  29. cin >> s[i];
  30. s[i] += s[i - ];
  31. }
  32. l = r = ;
  33. for(int i = ; i <= n; ++i) {
  34. while(l < r && ask(q[l], q[l + ]) < * a(i)) l++;
  35. f[i] = f[q[l]] + (a(i) - b(q[l]))* (a(i) - b(q[l]));
  36. while(l < r && ask(i, q[r]) < ask(q[r], q[r - ])) r--;
  37. q[++r] = i;
  38. }
  39. cout << (ll)f[n] << '\n';
  40. return ;
  41. }

【HNOI2008】玩具装箱的更多相关文章

  1. BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][St ...

  2. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

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

  3. 【bzoj1010】[HNOI2008]玩具装箱toy

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9281  Solved: 3719[Submit][St ...

  4. 【BZOJ 1010】 [HNOI2008]玩具装箱toy (斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9330  Solved: 3739 Descriptio ...

  5. bzoj 1010 [HNOI2008]玩具装箱toy(DP的斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7874  Solved: 3047[Submit][St ...

  6. BZOJ 1010 [HNOI2008]玩具装箱toy

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7184  Solved: 2724[Submit][St ...

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

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

  8. P3195 [HNOI2008]玩具装箱TOY(斜率优化dp)

    P3195 [HNOI2008]玩具装箱TOY 设前缀和为$s[i]$ 那么显然可以得出方程 $f[i]=f[j]+(s[i]-s[j]+i-j-L-1)^{2}$ 换下顺序 $f[i]=f[j]+( ...

  9. [luogu P3195] [HNOI2008]玩具装箱TOY

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

  10. cogs 1330 [HNOI2008]玩具装箱toy

    cogs 1330 [HNOI2008]玩具装箱toy 瞎扯,急忙AC的请跳过 感觉数据结构写的太多了有点晕=+ 发现还没学斜率优化+- 于是来学一学QwQ 上次这题打了个决策优化直接水过了..理论O ...

随机推荐

  1. Android webview “location.replace” 不起作用

    js解决方法: function locationReplace(url){ if(history.replaceState){ history.replaceState(null, document ...

  2. CENSORING

    CENSORING 题目描述 FJ为它的奶牛订阅了很多杂志,balabala.......,其中有一些奶牛不宜的东西(比如如何煮牛排). FJ将杂志中所有的文章提取出来组成一个长度最多为10^5的字符 ...

  3. BZOJ3236: [Ahoi2013]作业 树状数组维护 莫队

    水果~~~~ 关于四个while可行性的证明:区间有正确性所以不管那团小东西用没有duang~反它最终总会由于两次覆盖二准确 关于区间种数可行性的证明:他会在0 1间(或两边)来回跳动(过程中),最终 ...

  4. [CVPR2017]Online Video Object Segmentation via Convolutional Trident Network

    基于三端卷积网络的在线视频目标分割 针对半监督视频目标分割任务,作者采取了和MaskTrace类似的思路,以optical flow为主. 本文亮点在于: 1. 使用共享backbone,三输出的自编 ...

  5. php模板引擎smarty

    一. smarty的特点 速度:相对于其他模板引擎,速度较快 编译型:在下次访问模板时直接访问编译文件,不再进行模板重新编译 缓存技术:可以将用户最终看到的HTML文件缓存成一个静态HTML 插件技术 ...

  6. Java中中英文对齐输出问题,以及Java中的格式化输出

    一 中英文对齐输出问题 问题,要求控制台输出如下: abcefg  def 森林 阿狗 其实就是要求对齐输出,各种查找java的格式化输出,然后发现只要一个简单的“\t”就可以实现. 代码如下: Sy ...

  7. [NOIp普及组2011]瑞士轮

    洛谷题目链接:瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较 ...

  8. python读写Excel文件_xlrd模块读取,xlwt模块写入

    一.安装xlrd模块和xlwt模块(服务器) 1. 下载xlrd模块和xlwt模块 到python官网http://pypi.python.org/pypi/xlrd下载模块.下载的文件例如:xlrd ...

  9. Tomcat启动报错:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet

    测试tomcat的comet Java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet 异常 因为工程 ...

  10. [bzoj3597][scoi2014]方伯伯运椰子——分数规划,负环

    题解 目标就是 \[Maximize\ \lambda = \frac{X-Y}{k}\] 按照分数规划的一般规律, 构造: \[g(\lambda) = \lambda k + Y - X\] 由于 ...