当前位置: 首页 > news >正文

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

【BZOJ3203】[Sdoi2013]保护出题人

Description

Input

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

Output

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

Sample Input

5 2
3 3
1 1
10 8
4 8
2 3

Sample Output

7

HINT

第一关:距离房子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≤10^5,1≤d≤10^12,1≤x≤ 10^12,1≤a≤10^12

题解:只考虑一次询问,我们将每个僵尸的血量看成它前面所有僵尸的血量之和,那么所有僵尸就是同时受到伤害的了。此时可以将每个僵尸看成一个点(距离,血量和),我们要求的就是满足所有x*k-y>=0的最小的k。

可以先用单调栈来维护所有点构成的上凸包,然后查询时找到原点到这个凸包的切线即可。找切线可以用二分(然而网上题解都是三分,你要想到把一个单峰函数求了导以后就变成单调函数了啊)。

但是每次的僵尸是从前面加入的,那么我们将原点平移,原来的点不动即可。

 

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=100010;
typedef long long ll;
typedef double ld;
int n,t;
ld d,sum,ans;
ld a,b,x[maxn],y[maxn];
int s[maxn];
int main()
{
	scanf("%d%lf",&n,&d);
	int i,l,r,mid;
	for(i=1;i<=n;i++)
	{
		scanf("%lf%lf",&a,&b),x[i]=-sum,sum+=a,y[i]=-i*d;
		while(t>1&&(y[i]-y[s[t]])/(x[i]-x[s[t]])>(y[s[t]]-y[s[t-1]])/(x[s[t]]-x[s[t-1]])-1e-15)	t--;
		s[++t]=i;
		l=1,r=t,x[0]=-sum,y[0]=-i*d-b;
		while(l<r)
		{
			mid=(l+r)>>1;
			if((y[s[mid]]-y[s[mid+1]])/(x[s[mid]]-x[s[mid+1]])>(y[s[mid+1]]-y[0])/(x[s[mid+1]]-x[0])-1e-15)	l=mid+1;
			else	r=mid;
		}
		ans+=(x[s[l]]-x[0])/(y[s[l]]-y[0]);
	}
	printf("%.0lf",ans);
	return 0;
}//5  2 3  3 1  1 10 8  4  8 2  3

 

转载于:https://www.cnblogs.com/CQzhangyu/p/7898751.html

相关文章:

  • c语言二级指针的作用,C语言中二级指针的实例详解
  • c语言二叉搜索树程序,二叉搜索树 C语言实现
  • Baidu IoT Study
  • 对ch452芯片初始化用c语言,用C8051F020单片机的伺服阀温度零漂测控系统
  • 逆向知识十一讲,识别函数的调用约定,函数参数,函数返回值.
  • crc16 ibm c语言,CRC16常见几个标准的算法及C语言实现
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • c语言打印http协议的代码,基于http协议的C语言客户端代码
  • [poj3686]The Windy's(费用流)
  • c语言x图形界面,「分享」C语言如何编写图形界面
  • 网站访问慢体系
  • android+手机+用短信发pdf文件,iPhone如何将PDF通过短信邮件发给别人【仅限iPhone6/6s】...
  • himall微信支付
  • android 特殊字符转,如何转义特殊字符,如’在sqlite在android
  • o'Reill的SVG精髓(第二版)学习笔记——第五章
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • angular组件开发
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • FineReport中如何实现自动滚屏效果
  • JAVA_NIO系列——Channel和Buffer详解
  • Linux gpio口使用方法
  • React Transition Group -- Transition 组件
  • vue数据传递--我有特殊的实现技巧
  • 回顾 Swift 多平台移植进度 #2
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 讲清楚之javascript作用域
  • 今年的LC3大会没了?
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 人脸识别最新开发经验demo
  • 使用common-codec进行md5加密
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​iOS安全加固方法及实现
  • ​插件化DPI在商用WIFI中的价值
  • # centos7下FFmpeg环境部署记录
  • # 达梦数据库知识点
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #define 用法
  • #pragma once与条件编译
  • #QT(TCP网络编程-服务端)
  • (4)Elastix图像配准:3D图像
  • (C语言)共用体union的用法举例
  • (floyd+补集) poj 3275
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十一)c52学习之旅-动态数码管
  • (四) 虚拟摄像头vivi体验
  • (四)汇编语言——简单程序
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET 的程序集加载上下文
  • @Repository 注解
  • [ C++ ] template 模板进阶 (特化,分离编译)