bzoj 1191 特别行动队

一道不错的斜率优化入门题,传送门:bzoj 1911

题目描述稍微有点不太清楚,先解释一下

将n个士兵分成几个连续的组,每一组的战斗力为f(y),其中:f(x)=ax2+bx+c(a,b,c题中已给),y为这一组中士兵战斗力之和,求这几个组的战斗力之和的最大值。

考虑dp,设dp[x]表示将前x个士兵分组后所得到的战斗力的最大值

设v[i]为士兵i的战斗力,则有dp方程:

bzoj 1191 特别行动队

bzoj 1191 特别行动队

bzoj 1191 特别行动队

然而复杂度还是n2的,看一下数据范围,n≤1000000,枚举必然TLE,我们需要更好的的办法,处理一下dp方程,把右侧乘开,

bzoj 1191 特别行动队

我们惊奇的发现,右侧出现了一些只与i有关的项,我们把它移到左边,在稍加整理,将C移项后,得到:

bzoj 1191 特别行动队

现在,我们把它变成一条直线,令:

k=s[i]

b=dp[i]-As[i]2-Bs[i]-C

x=2As[j]

y=dp[j]+As[j]2-Bs[j]

这样,这条直线便只与i有关了,要求dp[i],就是求b的最大值,因而,我们产生了一种新的策略,在一个平面直角坐标系上,记录一系列的点,并从这些点中选取一个最优的,但这样好像还是n2的啊

别怕,我们可以进一步优化,

首先,很明显的一点是,最优的点一定在凸包上,不在凸包上的点便可以直接排除

其次,由于战力大于0,因而k会单调递增,这样,就可以每次将斜率小于k的点全部排除,这样,使用单调队列维护凸包,每算出一个点就将其推入队列,便可O(1)找出最优的j了,便成功的优化成了O(n)

谨此献上代码

1 #include
 2 int n,a,b,c,head,tail;
 3 long long val[1001000],pre[1001000],que[1001000],dp[1001000];
 4 inline long long getx(long long v)
 5 {
 6     return 2*a*pre[v];
 7 }
 8 inline long long gety(long long v)
 9 {
10     return dp[v]+a*pre[v]*pre[v]-b*pre[v];
11 }
12 inline long long getdp(long long aa,long long bb)
13 {
14     return dp[bb]+a*pre[bb]*pre[bb]-b*pre[bb]-2*a*pre[aa]*pre[bb]+a*pre[aa]*pre[aa]+b*pre[aa]+c;
15 }
16 inline double getk(long long aa,long long bb)
17 {
18     return ((double)(gety(aa)-gety(bb)))/((double)(getx(aa)-getx(bb)));
19 }
20 int main()
21 {
22     scanf("%d%d%d%d",&n,&a,&b,&c);
23     for(int i=1;i)
24     {
25         scanf("%d",&val[i]);
26         pre[i]=pre[i-1]+val[i];
27     }
28     for(int i=1;i)
29     {
30         while(head1])pre[i])
31         {
32             head++;
33         }
34         dp[i]=getdp(i,que[head]);
35         while(head1]))
36         {
37             tail--;
38         }
39         que[++tail]=i;
40     }
41     printf("%d\n",dp[n]);
42     return 0;
43 }

Original: https://www.cnblogs.com/Grharris/p/10371835.html
Author: Grharris
Title: bzoj 1191 特别行动队

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578008/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 如何在shell脚本中传变量的值传给curl

    随着即时通讯的发展,大量的报警媒介已经从以往的邮件转为钉钉,企业微信等聊天工具。当我使用shell脚本来监控 Keepalived的时候,在给curl传递变量的时候无法生效,经过查…

    Linux 2023年6月8日
    099
  • @JsonFormat和@DateTimeFormat的作用

    @DatetimeFormat是将String转换成Date,一般前台给后台传值时用 import org.springframework.format.annotation.Da…

    Linux 2023年6月7日
    098
  • Redis 经验谈

    新浪作为全世界最大的Redis用户,在开发和运维方面有非常多的经验。本文作者来自新浪,希望能为业界提供一些亲身经历,让大家少走弯路。 使用初衷 从2010年上半年起,我们就开始尝试…

    Linux 2023年5月28日
    097
  • 新年伊始我的centos8没法更新了

    22年春节后centos8竟然没法更新了,提示 No URLs in mirrorlist如下: yum update Repository extras is listed mo…

    Linux 2023年6月13日
    0242
  • Linux 最小安装与 Xshell 远程工具的使用

    写在前面:本篇文章介绍了CtenOS的最小安装方法,以及使虚拟机使用VMware的桥接模式的方法。桥接模式下的虚拟机,相当于和物理机处于同一物理网络(网线、WIFI等)下。在多台物…

    Linux 2023年6月8日
    0115
  • 数据结构 一元多项式加减法计算器

    cpp;gutter:true;</p> <h1>include</h1> <p>using namespace std;</…

    Linux 2023年6月13日
    088
  • Redis源码系列(二)

    Redis源码系列——双链表 redis底层的数据结构使用了双链表,其实现很简洁,值得阅读。 原型 src/adlist.h /*list node*/ typedef struc…

    Linux 2023年6月8日
    0114
  • 用户管理

    用户组 种类 基本组: 一个用户一定要有一个基本组 ,且只有一个 附加组: 一个用户可以没有附加组,一个用户可以有多个附加组 分别基本组和 附加组?[root@localhost …

    Linux 2023年6月6日
    0155
  • 高速USB转8串口产品设计-RS485串口

    基于480Mbps 高速USB转8路串口芯片CH348,可以为各类主机扩展出8个独立的串口。使用厂商提供的VCP串口驱动程序,可支持Windows、Linux、Android、ma…

    Linux 2023年6月7日
    0121
  • 2. 文件与I/O

    文件与I/o open 系统调用 close 系统调用 creat 系统调用 read 系统调用 write 系统调用 open&#x7CFB;&#x7EDF;&a…

    Linux 2023年6月6日
    097
  • 运算符重载限制

    p387 5.表 11.1 中的大多数运算符都可以通过成员或非成员函数进行重载,但下面的运算符只能通过成员函数进行重载。 =:赋值运算符。 ():函数调用运算符。 []:下标运算符…

    Linux 2023年6月13日
    0101
  • 兼容各种浏览器的自动左右滚动兼左右点击滚动代码

    直接切入正题 红色表示要统一(所有的id) 本框架为phpcms,大家可根据自己的框架更改循环。 {pc:content action=”lists” ca…

    Linux 2023年6月13日
    092
  • 单片机 MCU 固件打包脚本软件

    ​ 1 前言 开发完 MCU 软件后,通常都会生成 hex 文件或者 bin 文件,用来做固件烧录或者升级,如果用来做产品开发,就涉及到固件版本的问题,初学者通常采用固件文件重命名…

    Linux 2023年6月7日
    0105
  • batch批处理笔记

    1. echo 和 @ 回显命令 @ #关闭单行回显 echo off #从下一行开始关闭回显 @echo off #从本行开始关闭回显。一般批处理第一行都是这个 echo on …

    Linux 2023年6月7日
    089
  • 渗透测试常用方法总结

    转载自 https://blog.csdn.net/qq_42636435/article/details/92839738 Original: https://www.cnblo…

    Linux 2023年6月7日
    080
  • 1:文件与目录

    CD 切换当前工作目录 mkdir 创建目录 re -dir 删除目录 pwd 打印当前工作目录 绝对路径和相对路径 硬链接 和软链接 CP拷贝 MV 移动 dirname 和 b…

    Linux 2023年6月7日
    0142
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球