洛谷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 ...
随机推荐
- sql 字符串连接
const string FMCG_BASH = "清除重复商品"; var sqls = new List<string>(); //// Fmcg sqls.},R ...
- javaweb中静态文件的处理方法
方案一:激活Tomcat的defaultServlet来处理静态文件 在web.xml中添加: <servlet-mapping> <servlet-name>default& ...
- C++ 系列:C++ 内存布局
1 前言 了解你所使用的编程语言究竟是如何实现的,对于C++程序员可能特别有意义.首先,它可以去除我们对于所使用语言的神秘感,使我们不至于对于编译器干的活感到完全不可思议:尤其重要的是,它使我们在De ...
- 算法系列:Shell 排序
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- 3.pycharm spark配置
pycharm 内的环境变量配置 选择相应的spark程序文件的对应的配置信息 PYSPARK_PYTHON:python的安装路径 PYTHONPATH:spark安 ...
- leetcode-154-寻找旋转排序数组中的最小值
题目描述: 方法一: class Solution: def findMin(self, nums: List[int]) -> int: left, right = 0, len(nums) ...
- 容斥原理——hdu2841
记得要开ll /* 莫比乌斯反演模板题,也可以直接算phi来做 容斥的解法 求x[1..m],在[1,n]中和其互质的数的个数即可 那么就是n-和x不互质的数个数即可 */ #include<b ...
- Laravel 5.8 添加服务层
参考网址:https://blog.csdn.net/dmt742055597/article/details/97192177#Laravel58service_1
- 深入浅出 Java Concurrency (40): 并发总结 part 4 性能与伸缩性[转]
性能与伸缩性 使用线程的一种说法是为了提高性能.多线程可以使程序充分利用闲置的资源,提高资源的利用率,同时能够并行处理任务,提高系统的响应性. 但是很显然,引入线程的同时也引入了系统的复杂性.另外系统 ...
- 使用Native API 创建进程
使用 Native API 创建进程 最近几个星期一直在研究这个题目.因为关于方面的资料比较多(可以看下面的参考文章),所以开始时以为很快就结束了.谁知道真正动起手来才发现有很多要考虑的地方,不过还好 ...