注意每一关的时候,前一关的植物会消失。保留整数指四舍五入。

解:冷静分析一波,列一个式子出来,发现每一关的植物攻击力要是(ai + ... + aj) / (xi + d * (i - j))的最大值。1 <= j <= i

然后把这个东西写成前缀和,分母的i和j分离:(si - sj-1) / (xi + d * i - d * j))

发现就是两个点(xi + d * i, si)和(d * j, sj-1)之间的斜率。

于是维护一个下凸包然后凸包上三分就行了。注意到插入的点的横坐标单增,单调栈即可。

整数三分,就考虑l + 1 = r的时候怎么取,也比较好写。

 #include <bits/stdc++.h>

 typedef long long LL;
const int N = ;
const double eps = 1e-; struct Vec {
double x, y;
Vec(double X = , double Y = ) {
x = X;
y = Y;
}
inline Vec operator + (const Vec &w) const {
return Vec(x + w.x, y + w.y);
}
inline Vec operator - (const Vec &w) const {
return Vec(x - w.x, y - w.y);
}
inline double operator * (const Vec &w) const {
return x * w.y - y * w.x;
}
};
typedef Vec Poi; Poi node[N];
LL a[N], x[N], sum[N], d;
int n, top, stk[N]; int main() {
scanf("%d%lld", &n, &d);
for(int i = ; i <= n; i++) {
scanf("%lld%lld", &a[i], &x[i]);
sum[i] = sum[i - ] + a[i];
}
double ans = ;
for(int i = ; i <= n; i++) {
Poi now(x[i] + i * d, sum[i]);
node[i] = Poi(i * d, sum[i - ]);
while(top > && (node[stk[top]] - node[stk[top - ]]) * (node[i] - node[stk[top]]) < eps) {
top--;
}
stk[++top] = i;
//printf("stk %d = %d (%lld %lld) \n", top, i, i * d, sum[i - 1]);
//printf("now (%lld %lld) \n", x[i] + i * d, sum[i]);
int l = , r = top;
while(l < r) {
int mid = (l + r) >> ;
int ml = stk[mid], mr = stk[mid + ];
double vl = (double)(sum[i] - sum[ml - ]) / (x[i] + (i - ml) * d),
vr = (double)(sum[i] - sum[mr - ]) / (x[i] + d * (i - mr));
//printf("vl = %lf vr = %lf \n", vl, vr);
//printf("x = %lld y = %lld = %lld + %d * %lld \n", sum[i], x[i] + i * d, x[i], i, d);
if(vl < vr) {
l = mid + ;
}
else {
r = mid;
}
}
ans += (double)(sum[i] - sum[stk[r] - ]) / (x[i] + (i - stk[r]) * d);
//printf("ans += %lf \n", (double)(sum[i] - sum[stk[r] - 1]) / (x[i] + (i - stk[r]) * d));
//printf("r = %d \n", r);
/*for(int j = 1; j <= top; j++) {
printf("%d ", stk[j]);
}
puts("");*/
} printf("%.0f\n", ans);
return ;
}

AC代码

洛谷P3299 保护出题人的更多相关文章

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

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

  2. 【BZOJ3203】保护出题人(动态规划,斜率优化)

    [BZOJ3203]保护出题人(动态规划,斜率优化) 题面 BZOJ 洛谷 题解 在最优情况下,肯定是存在某只僵尸在到达重点的那一瞬间将其打死 我们现在知道了每只僵尸到达终点的时间,因为僵尸要依次打死 ...

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

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

  4. BZOJ3203 保护出题人(defend)

    保护出题人(defend) 题目描述 输入 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离. 接下来n行每行两个空格隔开的正整数,第i + 1行为 a i和 x i,分别表示相比上一 ...

  5. [SDOI2013]保护出题人

    题目 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企图攻击铭铭的家.而你作为SDOI2013的参赛者 ...

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

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

  7. 【JZOJ3299】【SDOI2013】保护出题人 三分+凸壳

    题面 ​出题人铭铭认为给SDOI2012 出题太可怕了,因为总要被骂,于是他又给SDOI2013 出题了. 参加SDOI2012 的小朋友们释放出大量的僵尸,企图攻击铭铭的家.而你作为SDOI2013 ...

  8. BZOJ 3203 [SDOI2013]保护出题人 (凸包+三分)

    洛谷传送门 题目大意:太长略 每新加入一个僵尸,容易得到方程$ans[i]=max{\frac{sum_{i}-sum_{j-1}}{s_{i}+d(i-j)}}$ 即从头开始每一段僵尸都需要在规定距 ...

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

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

随机推荐

  1. 窥探C语言程序的编译、链接与.h文件

    概述 C语言程序从源文件经过编译.链接生成可执行文件.那么编译与链接分别做了什么? 开发中为什么使用.h编写函数的声明?接下来使用案例说清楚为什么这样编写代码. C语言程序的编译和链接 C语言程序从源 ...

  2. linux流量监控iftop命令安装详解

    iftop跟nload差不多,也是捕获网卡流量的命令,nload的安装见之前发布的教程:http://www.cnblogs.com/catlee/p/5703541.html 开始安装.本文以cen ...

  3. python pip安装扩展报错

    1.安装tldr报错 (1)报错详情: [root@linuxnode1 ~]# pip install tldrCollecting tldr Downloading https://files.p ...

  4. c# 中反射里的invoke方法的参数

    一个最简单的C#反射实例,首先编写类库如下: namespace ReflectionTest { public class WriteTest { //带参数的公共方法 public void Wr ...

  5. [JZOJ4913] 【GDOI2017模拟12.3】告别

    题目 描述 题目大意 给你两个排列AAA和BBB,每次随即选三个数进行轮换操作,问mmm次操作内使AAA变成BBB的概率. 思考历程 首先随便搞一下,就变成了AAA中每个数回归自己原位. 一眼望去,感 ...

  6. thinkphp 模板赋值

    如果要在模板中输出变量,必须在在控制器中把变量传递给模板,系统提供了assign方法对模板变量赋值,无论何种变量类型都统一使用assign赋值. 大理石平台检定规程 $this->assign( ...

  7. C#一般处理程序设置和读取session(session报错“未将对象引用设置到对象的实例”解决)

    登陆模块时,用到了session和cookie.在一般处理程序中处理session,一直报错.最后找到问题原因是需要调用 irequiressessionstate接口. 在ashx文件中,设置ses ...

  8. CDATA标签用法

    今天在xml文件里看到有CDATA标签的使用,   答案如下: CDATA 术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data). 在 X ...

  9. PAT甲级——A1102 Invert a Binary Tree

    The following is from Max Howell @twitter: Google: 90% of our engineers use the software you wrote ( ...

  10. PAT甲级——A1090 Highest Price in Supply Chain

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...