题目

出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了。

参加SDOI2012的小朋友们释放出大量的僵尸,企图攻击铭铭的家。而你作为SDOI2013的参赛者,你需要保护出题人铭铭。

僵尸从唯一一条笔直道路接近,你们需要在铭铭的房门前放置植物攻击僵尸,避免僵尸碰到房子。

第一关,一只血量为\(a_1\)点的墦尸从距离房子\(x_1\)米处速接近,你们放置了攻击力为\(y_1\)点/秒的植物进行防御;第二关,在上一关基础上,僵尸队列排头增加一只血量为\(a_2\)点的僵尸,与后一只僵尸距离\(d\)米,从距离房\(x_2\)米处匀速接近,你们重新放置攻击力为\(y_2\)点/秒的植物;……;第\(n\)关,僵尸队列共有\(n\)只僵尸,相邻两只僵尸距离\(d\)米,排头僵尸血量为\(a_n\)点,排第二的 僵尸血量\(a_{n-1}\),以此类推,排头僵尸从距离房子\(x_n\)米处匀速接近,其余僵尸跟随排头同时接近,你们重新放置攻击力为\(y_n\)点/秒的植物。

每只僵尸直线移动速度均为\(1\)米/秒,由于植物射击速度远大于僵尸移动速度,可忽略植物子弹在空中的时间。所有僵尸同时出现并接近,因此当一只僵尸死亡后,下一只僵尸立刻开始受到植物子弹的伤害。

游戏得分取决于你们放置的植物攻击力的总和\(\sum \limits _{i=1} ^{n} y_i\),和越小分数越高,为了追求分数上界,你们每关都要放置攻击力尽量小的植物。

作为SDOI2013的参赛选手,你们能保护出题人么?

输入输出格式

输入格式:

第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离。

接下来n行每行两个空格隔开的正整数,第i + 1行为Ai和 Xi,分别表示相比上一关在僵尸队列排头增加血量为Ai 点的僵尸,排头僵尸从距离房子Xi米处开始接近。

输出格式:

一个数,n关植物攻击力的最小总和 ,保留到整数。

输入输出样例

输入样例#1: 复制

5 2

3 3

1 1

10 8

4 8

2 3

输出样例#1: 复制

7

说明

第一关:距离房子3米处有一只血量3点的僵尸,植物最小攻击力为1.00000;

第二关:距离房子1米处有一只血量1点的僵尸、3米处有血量3点的僵尸,植物最小攻击力为1.33333;

第三关:距离房子8米处有一只血量10点的僵尸、10米处有血量1点的僵尸、12米处有血量3点的僵尸,植物最小攻击力为1.25000;

第四关:距离房子8米处有一只血量4点的僵尸、10米处有血量10点的僵尸、12米处有血量1点的僵尸、14米处有血量3点的僵尸,植物最小攻击力为1.40000;

第五关:距离房子3米处有一只血量2点的僵尸、5米处有血量4点的僵尸、7米处有 血量10点的僵尸、9米处有血量1点的僵尸、11米处有血量3点的僵尸,植物最小攻击力 为2.28571。

植物攻击力的最小总和为7.26905。

对于100%的数据, 1<=n<=105,1<=d<=1012,1<=x<= 1012,1<=a<=1012


题解

思维僵化,只想着能不能求点积的最大值忘了考虑斜率最大值了

单调栈维护下凸包

\(f_i = max(\frac{sum[i] - sum[j-1]}{x[i] + (i - j)d})\)

然后发现式子似乎与斜率有关系

那就考虑把有\(i\)的项和有\(j\)的项分开

\(f_i=\frac{sum[i] - sum[j-1]}{x_i+id - jd}\)

这样可以发现\(f_i\)似乎就是点\(A(x_i+id , sum[i])\)和点\(B(jd , sum[j-1])\)的斜率的最大值

然后可以发现\(x_i+id\)的大小是单增的

而且一定在\(j\)的右边

并且\(sum_i\)也是单增的,而且在\(j\)的上边

那么我们就可以维护一个点为\((id,sum[i-1])\)的下凸包

斜率最大的点就一定在这个下凸包上

并且点\((x_i+id,sum[i])\)与点\((jd , sum[j-1])\)斜率在下凸包上是单调的

三分就行了

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
const int M = 100005 ;
using namespace std ; int n , tp ;
double d , ans , val[M] , stp[M] , sum[M] ;
struct Vec { double x , y ; } st[M] ;
inline Vec operator - (Vec a , Vec b) { return (Vec) { a.x - b.x , a.y - b.y } ; }
inline double Cross(Vec a , Vec b) { return a.x * b.y - a.y * b.x ; }
inline double Slope(Vec a , Vec b) { return (a.y - b.y) / (a.x - b.x) ; } int main() {
scanf("%d%lf",&n,&d) ;
for(int i = 1 ; i <= n ; i ++) {
scanf("%lf%lf",&val[i] , &stp[i]) ;
sum[i] = sum[i - 1] + val[i] ;
Vec po = (Vec) { stp[i] + i * d , sum[i] } , pi = (Vec) { i * d , sum[i - 1] } ;
while(tp > 1 && Cross(pi - st[tp - 1] , st[tp] - st[tp - 1]) > 0) -- tp ;
st[++tp] = pi ;
int l = 1 , r = tp , lmid , rmid ;
while(r - l >= 3) {
lmid = (l + r) >> 1 ; rmid = (lmid + r) >> 1 ;
if(Slope(po , st[lmid]) > Slope(po , st[rmid])) r = rmid ;
else l = lmid ;
}
lmid = (l + r) >> 1 ; rmid = (lmid + r) >> 1 ;
ans += max(Slope(po , st[l]) , max(Slope(po , st[r]) , max(Slope(po , st[lmid]) , Slope(po , st[rmid])))) ;
}
printf("%.0lf\n",ans) ;
return 0 ;
}

[SDOI2013]保护出题人的更多相关文章

  1. 洛谷 P3299 [SDOI2013]保护出题人 解题报告

    P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...

  2. 【BZOJ3203】[Sdoi2013]保护出题人 二分+凸包

    [BZOJ3203][Sdoi2013]保护出题人 Description Input 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + ...

  3. [BZOJ3203] [SDOI2013]保护出题人(二分+凸包)

    [BZOJ3203] [SDOI2013]保护出题人(二分+凸包) 题面 题面较长,略 分析 对于第i关,我们算出能够打死前k个个僵尸的最小能力值,再取最大值就可以得到\(y_i\). 前j-1个僵尸 ...

  4. BZOJ 3203 Luogu P3299 [SDOI2013]保护出题人 (凸包、斜率优化、二分)

    惊了,我怎么这么菜啊.. 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=3203 (luogu)https://www.lu ...

  5. [bzoj3203][Sdoi2013]保护出题人

    人生第一道三分?... 把进攻序列里的前i只僵尸看成一个点,横坐标是第i只僵尸到达的时间,纵坐标是这i只僵尸的血量总和..就是说植物必须在这段时间内输出这些伤害..那么单位时间的输出伤害就是斜率了. ...

  6. 【文文殿下】 [SDOI2013]保护出题人 题解

    题解 我们把伤害-时间图像画出来.然后维护一下僵尸血量的前缀和.最好情况肯定是有一个僵尸恰好死在戴夫家门口.我们把原点到其他n个点的斜率最大的一个累积到答案. 发现每添加一个点,其他所有点的坐标都变了 ...

  7. BZOJ3203 SDOI2013保护出题人(三分)

    给a做一个前缀和,那么现在每次所查询的就是(sn-sk)/(bn+nd-(k+1)d)的最大值.这个式子可以看成是(bn+nd,sn)和((k+1)d,sk)所成直线的斜率. 脑补一条直线不断减小斜率 ...

  8. 【bzoj3203】[Sdoi2013]保护出题人 凸包+二分

    题目描述 输入 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + 1行为Ai和 Xi,分别表示相比上一关在僵尸队列排头增加血量为Ai 点的 ...

  9. 【洛谷 P3299】 [SDOI2013]保护出题人 (凸包,三分,斜率优化)

    题目链接 易得第\(i\)关的最小攻击力为\(\max_{j=1}^i\frac{sum[i]-sum[j-1]}{x+d*(i-j)}\) 十分像一个斜率式,于是看作一个点\(P(x+d*i,sum ...

随机推荐

  1. Spring中基于AOP的@AspectJ

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/aop-with-spring-framenwork/aspectj-based-aop-with- ...

  2. [Angular] Expose Angular Component Logic Using State Reducers

    A component author has no way of knowing which state changes a consumer will want to override, but s ...

  3. Hadoop-08-Hive本地独立式安装

    1.安装mysql sudo apt-get install mysql-server mysql-client 2.使用root账户登录mysql数据库,新建存放hive元数据的数据库.如果叫hiv ...

  4. asp.net mvc 抓取京东商城分类

    555 asp.net mvc 抓取京东商城分类   URL:http://www.jd.com/allSort.aspx   效果:   //后台代码 public ActionResult Get ...

  5. js将月份转换为英文简写的形式

    本文通过代码实例介绍一下如何实现将月份转换为英文简写的形式. 比如将一月份转换为Jan,需要的朋友可以做一下参考. 代码实例如下: [JavaScript] 纯文本查看 复制代码运行代码 1 2 3 ...

  6. Intel为Google的物联网平台Brillo推出开发板Edison

    Brillo* is a solution from Google* for building connected devices. Incorporating aspects of the Andr ...

  7. HDU 1031.Design T-Shirt【结构体二次排序】【8月21】

    Design T-Shirt Problem Description Soon after he decided to design a T-shirt for our Algorithm Board ...

  8. 修正iOS从照相机和相册中获取的图片 方向

    修正iOS从照相机和相册中获取的图片 方向   修正iOS从照相机和相册中获取的图片 方向 使用系统相机拍照得到的图片的默认方向有时不是ImageOrientationDown,而是ImageOrie ...

  9. iptraf 网卡 ip 端口 监控 netstat 关闭端口方法

    18 commands to monitor network bandwidth on Linux server – BinaryTides https://www.binarytides.com/l ...

  10. res_d_l =[{'contents':d.contents,'href':d.attrs['href']} for d in rd] 泛型

    from selenium import webdriverfrom selenium.webdriver.chrome.options import Options# from selenium.w ...