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

解:冷静分析一波,列一个式子出来,发现每一关的植物攻击力要是(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. DEDECMS织梦后台更新网站栏目无反应一键更新无响应的解决方法

    很多站长朋友反应,经常会遇到DEDECMS织梦后台更新网站栏目无反应和一键更新无响应的问题,这个问题的所在就是在于恢复了数据或者覆盖了织梦后台文件之后,点击一键更新完全没反应,或者生成栏目的时候其他都 ...

  2. 最全Linux常用命令大全

    查看系统系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMB ...

  3. JS规则 自加一,自减一 ( ++和- -) 【mynum = mynum + 1;//等同于mynum++;】

    自加一,自减一 ( ++和- -) 算术操作符除了(+.-.*./)外,还有两个非常常用的操作符,自加一"++":自减一"--".首先来看一个例子: mynum ...

  4. RSA算法的基本原理

    记得在我上初一的时候做过这么一道数学竞赛题,就是求7的222次方的个位数字.当时教材上介绍的解题方法是将222分解成4*55+2,然后算出7的2次方个个位数字即为要算的数值.当时年幼无知的我根本不了解 ...

  5. thinkphp 组合查询

    组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string).复合查询(_complex).请求字符串查询(_query),混合查询中的特殊查询每次查询只能定 ...

  6. 数据库存含中文的json 时避免存成中文的ascii

    使用json.dumps将dict转换为json时 如果包含中文 会将中文变成中文对应的ascii编码 当把这样的json存进数据库再取出之后反斜杠没有了会变成: 使用 json.dumps(x,en ...

  7. Http协议之content

    用android 通过http协议提交数据至服务器 content的内容 代码如下: private static JSONObject connUpload(String baseUrl, Map& ...

  8. Django项目订单接入支付宝

    1.首先下载所需要的包 pip install python-alipay-sdk 2.在视图函数里面引入所需要的类 from alipay import AliPay 3.利用这个类创建一个实例对象 ...

  9. js 获取字符串中某字符第二次出现的下标

    var res = "a-b-c-d";var index = find(res,'-',1); //字符串res中第二个‘-’的下标 var ress = res.substri ...

  10. 关于Spring Cloud Feign的一些记录!

    学习Spring Cloud Feign过程中,相关资料都会反复强调:微服务调用的话(@FeignClient)  客户端方法的返回值和服务端方法的返回值还有方法名之类的都是要求一致的! 关于方法名是 ...