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)

大家都在看

  • 剑指offer计划22( 位运算中等)—java

    1.1、题目1 剑指 Offer 56 – I. 数组中数字出现的次数 1.2、解法 救命,真不会用位运算,还是用哈希表做吧,位运算过段时间再学习~~~搞不来,虽然说哈…

    Linux 2023年6月11日
    073
  • 国庆专属头像一键生成搭建教程,附源码!

    国庆节马上就要来啦! 没有一个像样的微信头像怎么行。 为此小编为大家带来了一款国庆节国旗头像生成源码,有服务器、域名的朋友可以自行下载上传至服务器之后提供给大家使用。 没有服务器、…

    Linux 2023年6月7日
    0102
  • [Git专题] 环境搭建

    环境搭建 在正式使用 Git 之前,首先应当安装 Git 并完成一些基础配置,本章内容就教大家在 Ubuntu 和 CentOS 上安装 Git 的方法。 如果你使用的是基于 De…

    Linux 2023年5月27日
    084
  • 如何分析redis中的慢查询

    慢查询只记录命令执行时间,并不包括命令排队和网络传输时间。因此客户端执行命令的时间会大于命令实际执行时间。因为命令执行排队机制,慢查询会导致其他命令级联阻塞,因此当客户端出现请求超…

    Linux 2023年5月28日
    085
  • 2021年3月-第02阶段-前端基础-HTML+CSS阶段-Day03

    HTML5 第三天 一、 认识 3D 转换 3D 的特点 近大远小 物体和面遮挡不可见 三维坐标系 x 轴:水平向右 — 注意:x 轴右边是正值,左边是负值 y 轴:垂…

    Linux 2023年6月8日
    0104
  • PTA 《基础编程题目集》 6-6 求单链表结点的阶乘和

    本题要求实现一个函数,求单链表L结点的阶乘和。这里默认所有结点的值非负,且题目保证结果在int范围内。 函数接口定义: int FactorialSum( List L ); 其中…

    Linux 2023年6月8日
    0127
  • 关于 Promise 的一些简单理解

    一、ES6 中的 Promise 1、JS 如何解决 异步问题? (1)什么是 同步、异步?同步指的是 需要等待 前一个处理 完成,才会进行 下一个处理。异步指的是 不需要等待 前…

    Linux 2023年6月11日
    0105
  • linux命令之wget下载

    wget wget 是一个下载文件的工具。 格式 wget [参数] [URL地址] 常用参…

    Linux 2023年5月27日
    079
  • docker 安装redis

    1、获取 redis 镜像 2、查看本地镜像 bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问 protected-mode no #默认yes,开启保…

    Linux 2023年5月28日
    085
  • MySQL 知识点总结(简易版)

    MySQL 总结(简易版) 基本语法 0. 1基本语法 登录MySQL $ mysql -u root -p12345612 &…

    Linux 2023年6月7日
    096
  • MySQL slow log 慢日志

    sql慢日志用于记录执行时间超过指定阈值的SQL,对于系统性能和故障排错非常有帮助 1.如何开启sql慢日志 –开启slow log …

    Linux 2023年6月6日
    072
  • Docker centos7,宝塔

    拉取一个centos镜像 docker pull centos:centos7 运行一个容器 docker run -i -t -d –restart=always –name…

    Linux 2023年6月6日
    088
  • OpenStack RedHat搭建

    一、准备环境 控制节点及计算节点必须开启虚拟化引擎Intel VT-x或AMD-V,且控制节点未来将被复用为计算节点;虚拟机配置可根据实际情况进行调整;务必配置 DNS,否则安装过…

    Linux 2023年6月8日
    079
  • SQL45 将titles_test表名修改为titles_2017

    本题链接本题省略表结构。需要用到RENAME TABLE子句,该子句可实现一或多个表名称的修改。子句语法为: RENAME TABLE tbl_name TO new_tbl_na…

    Linux 2023年6月13日
    079
  • Linux上安装tomcat

    参考https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-8-on-cento…

    Linux 2023年6月6日
    084
  • 闭包、装饰器

    闭包: 闭包的演变过程: 闭包的概念: “闭包”的本质就是函数的嵌套定义,即在函数内部再定义函数 “闭包”有两种不同的方式,第一种是…

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