2018.10.15 bzoj4570: [Scoi2016]妖怪(凸包)
传送门
不得不说这题有点东西啊。
看到题第一眼二分,用二次函数求范围来进行checkcheckcheck,20分滚粗了233.
于是开始思考正解。
发现可以把每只怪物的二元组属性看成二维坐标。
这时对于一只怪物(x,y)(x,y)(x,y),一种环境相当于是一条过了点(x,y)(x,y)(x,y)的直线,贡献就是在横纵坐标的截距之和。
观察之后很容易发现答案只跟所有点的右上凸壳有关系。
于是我们维护所有点的上凸壳。
然后依次找每个点对答案的贡献就行了。
代码:
#include<bits/stdc++.h>
#define db double
#define N 1000005
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int n,q[N],top=0;
struct pot{db x,y;}p[N];
const double inf=2e9,eps=1e-10;
inline bool cmp(const pot&a,const pot&b){return a.x==b.x?a.y<b.y:a.x<b.x;}
inline double calc(const pot&a,double k){return a.x+a.y+a.x*k+a.y/k;}
inline double slope(const pot&a,const pot&b){return (a.y-b.y)/(a.x-b.x);}
inline pot operator-(const pot&a,const pot&b){return (pot){a.x-b.x,a.y-b.y};}
inline double operator^(const pot&a,const pot&b){return a.x*b.y-a.y*b.x;}
inline double solve(){
	double ret=inf,l=-inf,r,k;
	for(int i=1;i<=top;++i){
		r=l,l=i==top?-eps:slope(p[q[i]],p[q[i+1]]),k=-sqrt(p[q[i]].y/p[q[i]].x);
		if(l<=k&&k<=r)ret=min(ret,calc(p[q[i]],-k));
		else ret=min(ret,calc(p[q[i]],-l)),ret=min(ret,calc(p[q[i]],-r));
	}
	return ret;
}
int main(){
	n=read();
	for(int i=1;i<=n;++i)p[i].x=read(),p[i].y=read();
	sort(p+1,p+n+1,cmp);
	for(int i=n;i;--i){
		while(top>2&&((p[i]-p[q[top-1]])^(p[q[top]]-p[q[top-1]]))>=0)--top;
		q[++top]=i;
	}
	while(top>1&&p[q[top]].y<=p[q[top-1]].y)--top;
	printf("%.4lf",solve());
	return 0;
}
												
											2018.10.15 bzoj4570: [Scoi2016]妖怪(凸包)的更多相关文章
- [BZOJ4570][SCOI2016]妖怪(凸包)
		
两种做法,前一种会TLE. 第一种是高一数学题做法,设一个妖怪的atk和dnf分别为x和y,则它在(a,b)环境下的战斗力为x+y/a*b+y+x/a*b. 设t为b/a,则战斗力即$f(x,y,t) ...
 - [Bzoj4570][Scoi2016]妖怪(右上凸包)
		
4570: [Scoi2016]妖怪 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1110 Solved: 336[Submit][Status][ ...
 - BZOJ4570: [Scoi2016]妖怪
		
题目传送门 4570: [Scoi2016]妖怪 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 491 Solved: 125 [Submit][Sta ...
 - bzoj 4570: [Scoi2016]妖怪 凸包
		
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4570 题解 我们知道如果一个怪物要取到攻击力的最大值,那么一定是把防御力都转化了 所以我 ...
 - BZOJ4570 SCOI2016妖怪(三分)
		
strength=atk*(1+b/a)+dnf*(1+a/b).设a/b=x,可以发现这是一个关于x的对勾函数.开口向上的一堆凸函数取max还是凸函数,三分即可. 然而无良出题人既卡精度又卡时间.众 ...
 - 梦想CAD控件 2018.10.15更新
		
下载地址: http://www.mxdraw.com/ndetail_10105.html 1. 完善com接口的ToCurves函数,转换CAD文字,多行文字到曲线 2. 修改DrawImage接 ...
 - 2018.10.15 bzoj3564: [SHOI2014]信号增幅仪(坐标处理+最小圆覆盖)
		
传送门 省选考最小圆覆盖? 亦可赛艇(你们什么都没看见) 在大佬的引领下成功做了出来. 就是旋转坐标使椭圆的横轴跟xxx轴平行. 然后压缩横坐标使得其变成一个圆. 然后跑最小覆盖圆就可以了. 注意题目 ...
 - 2018.10.15 bzoj4445: [Scoi2015]小凸想跑步(半平面交)
		
传送门 话说去年的省选计算几何难度跟前几年比起来根本不能做啊(虽然去年考的时候并没有学过计算几何) 这题就是推个式子然后上半平面交就做完了. 什么? 怎么推式子? 先把题目的概率转换成求出可行区域. ...
 - 2018.10.15 NOIP训练 hyc的等比数列(数论+枚举)
		
传送门 一道不错的枚举题. 显然桶排序之后瞎枚举一波. 考虑枚举首项和末项,假设首项除去一个最大的平方因子得到的结果为xxx. 那么末项一定等于xxx乘上一个平方数. 于是我们枚举首项,算出xxx然后 ...
 
随机推荐
- leetcode13
			
public class Solution { private int ChangeToInt(char c) { ; string s = c.ToString(); switch (s) { ca ...
 - RabbitMQ-从基础到实战(4)— 消息的交换(中)
			
转自:https://www.cnblogs.com/4----/p/6590459.html 1.简介 本章节和官方教程相似度较高,英文好的可以移步官方教程 在上一章的例子中,我们创建了一个消费者, ...
 - 19.OGNL与ValueStack(VS)-OGNL入门
			
转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 下面我们在com.asm.vo.User类中增加一个字段private Ad ...
 - eclipse使用ctrl+shift+F格式化代码失效
			
通常情况出现这种问题是组合快捷键和别的软件快捷键冲突了, 最常见的是和搜狗输入法冲突, 在设置中找到搜狗输入法然后把冲突的快捷键取消掉就可以了.
 - 面向对象三大特性一一多态(polymorphism)
			
package com.bjsxt.oop.polymorphism; public class Animal { public void voice(){ System.out.println(&q ...
 - QQ消息无限发送!源代码
			
昨天我一个朋友发给我一个特别有趣的程序 可以无限发送QQ消息,非常有趣! 发送给朋友之后只要打开,便可自动发送消息. 点打开后 便可一直发送消息 用Edit plus 打开后 其源代码如下 是用VB ...
 - ldd3 源码相关问题参见
			
参考地址: http://www.verydemo.com/demo_c92_i235635.html http://blog.csdn.net/silvervi/article/details/64 ...
 - docker registry2
			
https://blog.csdn.net/mideagroup/article/details/52052618
 - web 前端遇到的问题
			
前端小白一枚,经常遇到一些小问题,但是解决完吧,又记不住,哎,好记性不如烂笔头咯 1. 如何在js代码中设置checkbox选中? $("#select").attr('check ...
 - reduction
			
reduction - 必应词典 美[rɪ'dʌkʃən]英[rɪ'dʌkʃ(ə)n] n.还原:降低:减少:缩小 网络缩减:减量:减小 变形复数:reductions: