题目链接

斜率优化 不说了 网上很多 这的比较详细->Click Here or Here

  1. //1700kb 60ms
  2. #include<cstdio>
  3. #include<cctype>
  4. //#define gc() getchar()
  5. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  6. typedef long long LL;
  7. const int N=5e4+5,MAXIN=1e5;
  8. int n,C,S[N],q[N];
  9. char IN[MAXIN],*SS=IN,*TT=IN;
  10. LL f[N];
  11. inline int read()
  12. {
  13. int now=0,f=1;register char c=gc();
  14. for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
  15. for(;isdigit(c);now=now*10+c-'0',c=gc());
  16. return now*f;
  17. }
  18. inline LL Squ(LL x){
  19. return x*x;
  20. }
  21. inline LL X(int j,int k){
  22. return (S[j]-S[k])<<1;
  23. }
  24. inline LL Y(int j,int k){
  25. return f[j]+Squ(S[j]+C)-(f[k]+Squ(S[k]+C));
  26. }
  27. int main()
  28. {
  29. n=read(),C=read()+1;
  30. for(int i=1;i<=n;++i) S[i]=S[i-1]+read()+1;
  31. // for(int i=1;i<=n;++i) S[i]+=i;
  32. int h=1,t=1; q[1]=0;
  33. for(int i=1;i<=n;++i)
  34. {
  35. while(h<t && Y(q[h+1],q[h])<=S[i]*X(q[h+1],q[h])) ++h;
  36. f[i]=f[q[h]]+Squ(S[i]-S[q[h]]-C);
  37. while(h<t && Y(i,q[t])*X(q[t],q[t-1])<=Y(q[t],q[t-1])*X(i,q[t])) --t;
  38. q[++t]=i;
  39. }
  40. printf("%lld",f[n]);
  41. return 0;
  42. }

由决策单调,单调队列写法:\(\mathcal O(n\log n)\)

  1. //2288kb 140ms
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. //#define gc() getchar()
  6. #define MAXIN 100000
  7. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  8. typedef long long LL;
  9. const int N=50005;
  10. int n,L;
  11. LL sum[N],f[N];
  12. char IN[MAXIN],*SS=IN,*TT=IN;
  13. struct Node{
  14. int l,r,pos;//pos是区间[l,r]的最优转移点
  15. }q[N];
  16. inline int read()
  17. {
  18. int now=0;register char c=gc();
  19. for(;!isdigit(c);c=gc());
  20. for(;isdigit(c);now=now*10+c-'0',c=gc());
  21. return now;
  22. }
  23. inline LL Squ(LL x){
  24. return x*x;
  25. }
  26. inline LL Cost(int i,int p){//在i之前,分割p处
  27. return f[p]+Squ((LL)(i-p-1+sum[i]-sum[p]-L));
  28. }
  29. int Find(Node t,int x)
  30. {
  31. int l=t.l, r=t.r, mid;
  32. while(l<=r)
  33. if(mid=l+r>>1, Cost(mid,x)<Cost(mid,t.pos)) r=mid-1;
  34. else l=mid+1;
  35. return l;
  36. }
  37. int main()
  38. {
  39. n=read(), L=read();
  40. for(int i=1; i<=n; ++i) sum[i]=sum[i-1]+read();
  41. int h=1,t=1; q[1]=(Node){0,n,0};
  42. for(int i=1; i<=n; ++i)
  43. {
  44. if(i>q[h].r) ++h;
  45. f[i]=Cost(i,q[h].pos);
  46. if(Cost(n,i)<Cost(n,q[t].pos))//为什么要拿n比??不解。
  47. {
  48. while(h<=t && Cost(q[t].l,i)<Cost(q[t].l,q[t].pos)) --t;//队尾区间的l用i都比pos更优了,而决策点是单调的,所以[l,r]肯定都要不选pos而选i了
  49. if(h>t) q[++t]=(Node){i,n,i};
  50. else
  51. {
  52. int Pos=Find(q[t],i);
  53. q[t].r=Pos-1, q[++t]=(Node){Pos,n,i};
  54. }
  55. }
  56. }
  57. printf("%lld",f[n]);
  58. return 0;
  59. }

BZOJ.1010.[HNOI2008]玩具装箱toy(DP 斜率优化/单调队列 决策单调性)的更多相关文章

  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)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1010 题意: 思路: 容易得到朴素的递归方程:$dp(i)=min(dp(i),dp(k)+(i-k ...

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

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1010 题意: 有n条线段,长度分别为C[i]. 你需要将所有的线段分成若干组,每组中线段的 ...

  4. 1010: [HNOI2008]玩具装箱toy [dp][斜率优化]

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

  5. [bzoj1010](HNOI2008)玩具装箱toy(动态规划+斜率优化+单调队列)

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

  6. 1010: [HNOI2008]玩具装箱toy(斜率优化)

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

  7. [HNOI2008]玩具装箱TOY --- DP + 斜率优化 / 决策单调性

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

  8. BZOJ1010: [HNOI2008]玩具装箱toy(dp+斜率优化)

    Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 12451  Solved: 5407[Submit][Status][Discuss] Descript ...

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

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

随机推荐

  1. Python基础-封装与扩展、静态方法和类方法

    一.封装与扩展 封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码:而外部使用者只知道一个接口(函数),只要接口(函数)名.参数不变,使用者的代码永远无需改变.这就提供一个 ...

  2. 【转】Python流程控制语句

    [转]Python流程控制语句 人们常说人生就是一个不断做选择题的过程:有的人没得选,只有一条路能走:有的人好一点,可以二选一:有些能力好或者家境好的人,可以有更多的选择:还有一些人在人生的迷茫期会在 ...

  3. word打不开怎么办?

    方法一 故障描述:编辑Word文档的过程中,程序非法关闭,重新打开也是如此.即使重新安装了Office 2003,在启动Word 2003后仍然出现了异常情况.双击Word文档后,程序弹出出错对话框, ...

  4. 八大最安全的Linux发行版,具备匿名功能,做服务器的首选,web,企业服务器等

    10 best Linux distros for privacy fiends and security buffs in 2017 Introduction The awesome operati ...

  5. java中不同类型的数值占用字节数

    在Java中一共有8种基本数据类型,其中有4种整型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型和1种用于表示真值的boolean类型.(一个字节等于8个bit) 1.整型 类型 ...

  6. 日常用的css基础和自己常用的js封装

    css基础:base /* * 初始化 */ *::after, *::before { box-sizing: border-box; } body { font-family: 'Microsof ...

  7. centos6.5环境基于corosync+cman+rgmanager实现RHCS及iscsi+gfs2+clvm的文件系统集群

    centos6.5环境基于corosync+cman+rgmanager实现RHCS及iscsi+gfs2+clvm文件系统集群 一.环境准备 服务器列表: ansible server : 192. ...

  8. JOptionPane类提示框常用方法总结

    JOptionPane类封装了很多的方法,总结如下: 1.showMessageDialog 显示一个带有OK 按钮的模态对话框. 下面是几个使用showMessageDialog 的例子: Java ...

  9. javascript 搞不清原型链和constructor

    prototype.constructor仅仅可以用于识别对象是由哪个构造函数初始化的,仅此而已. var one=new Person(‘js’); 要解释这个结果就要仔细研究一下new这个操作符了 ...

  10. spoj227 树状数组插队序列问题

    插队问题和线段树解决的方式一样,每个结点维护值的信息是该节点之前的空位有多少,然后从后往前插点即可 注意该题要求输出的是从左往右输出每个士兵的等级,即问士兵最后排在第几个位置 /* 树状数组维护前i个 ...