洛谷P3299 保护出题人


注意每一关的时候,前一关的植物会消失。保留整数指四舍五入。
解:冷静分析一波,列一个式子出来,发现每一关的植物攻击力要是(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 保护出题人的更多相关文章
- 洛谷 P3299 [SDOI2013]保护出题人 解题报告
P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...
- 【BZOJ3203】保护出题人(动态规划,斜率优化)
[BZOJ3203]保护出题人(动态规划,斜率优化) 题面 BZOJ 洛谷 题解 在最优情况下,肯定是存在某只僵尸在到达重点的那一瞬间将其打死 我们现在知道了每只僵尸到达终点的时间,因为僵尸要依次打死 ...
- 【BZOJ3203】[Sdoi2013]保护出题人 二分+凸包
[BZOJ3203][Sdoi2013]保护出题人 Description Input 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + ...
- BZOJ3203 保护出题人(defend)
保护出题人(defend) 题目描述 输入 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离. 接下来n行每行两个空格隔开的正整数,第i + 1行为 a i和 x i,分别表示相比上一 ...
- [SDOI2013]保护出题人
题目 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企图攻击铭铭的家.而你作为SDOI2013的参赛者 ...
- [BZOJ3203] [SDOI2013]保护出题人(二分+凸包)
[BZOJ3203] [SDOI2013]保护出题人(二分+凸包) 题面 题面较长,略 分析 对于第i关,我们算出能够打死前k个个僵尸的最小能力值,再取最大值就可以得到\(y_i\). 前j-1个僵尸 ...
- 【JZOJ3299】【SDOI2013】保护出题人 三分+凸壳
题面 出题人铭铭认为给SDOI2012 出题太可怕了,因为总要被骂,于是他又给SDOI2013 出题了. 参加SDOI2012 的小朋友们释放出大量的僵尸,企图攻击铭铭的家.而你作为SDOI2013 ...
- BZOJ 3203 [SDOI2013]保护出题人 (凸包+三分)
洛谷传送门 题目大意:太长略 每新加入一个僵尸,容易得到方程$ans[i]=max{\frac{sum_{i}-sum_{j-1}}{s_{i}+d(i-j)}}$ 即从头开始每一段僵尸都需要在规定距 ...
- 【洛谷 P3299】 [SDOI2013]保护出题人 (凸包,三分,斜率优化)
题目链接 易得第\(i\)关的最小攻击力为\(\max_{j=1}^i\frac{sum[i]-sum[j-1]}{x+d*(i-j)}\) 十分像一个斜率式,于是看作一个点\(P(x+d*i,sum ...
随机推荐
- java_List接口
/** * java.util.list接口 extends Collection接口 * 1.有序的集合 * 2.有索引 * 3.元素可以重复 * * List中带索引的方法: *add:添加 * ...
- C#窗体代码相关笔记
获取ComboBox下拉列表的所有选项值 ArrayList al = new ArrayList(); foreach (string item in this.comboBox2.Items) { ...
- 移植 inetd
inetd 的选择及获取 Busybox1.1.3 提供了 inetd 支持.如果读者使用的是较低版本的不提供 inetd 的 Busybox,那么可以考虑使 用 netkit 套件来提供网络服务.强 ...
- Android开发 处理内存申请失败的报错(Failed to allocate a 38189038 byte allocation with 16777216 free bytes and 20MB until OOM)
问题原因 当你在操作图片或者其他大量文件数据时会出现:Failed to allocate a 38189038 byte allocation with 16777216 free bytes an ...
- loj2494 [hnoi2018]寻宝游戏
题意:给你n个元素的数组a.你可以在每个元素之前添加and和or的符号.每次询问最后变成r有多少种添号情况. n<=1000,m<=5000,q<=1000. 标程: #includ ...
- img属性src的特点
img属性src的特点: src=“图片地址” 成功则加载图片,失败则显示alt文字和断裂的图片 src="" 则不加载,不显示alt文字和断裂的图片 因此当图片加载失败后,$(& ...
- 健壮的 Java 基准测试
健壮的 Java 基准测试 健壮的 Java 基准测试,第 1 部分: 问题 了解 Java 代码基准测试的问题 Brent Boyer, 程序员, Elliptic Group, Inc. 简介:程 ...
- Java参数校验工具validation实践
介绍 在项目开发当中,数据校验是你必须要考虑和面对的事情,为此要写上一大串的代码进行校验,这样就会导致代码冗余和一些管理的问题. 例如下面的代码: public void push(List<L ...
- Flink Checkpoint 问题排查实用指南
在 Flink 中,状态可靠性保证由 Checkpoint 支持,当作业出现 failover 的情况下,Flink 会从最近成功的 Checkpoint 恢复.在实际情况中,我们可能会遇到 Chec ...
- centos6 nginx安装好以后,添加拓展ssl
前言 安装nginx的时候,只是执行最简单的安装,--user=nobody --group=nobody --prefix=/usr/local/nginx_1.8.1,没有安装http_ssl_m ...