P3194 [HNOI2008]水平可见直线 题解
时间:2021-08-04
本文章向大家介绍P3194 [HNOI2008]水平可见直线 题解,主要包括P3194 [HNOI2008]水平可见直线 题解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
光看是解不出题的。
自(he) 己(wan)画(ti)图(jie),发现没被挡住的多条直线会在平面上形成一个下凸包,从左到右斜率递增。
(取自p_b_p_b题解)
于是,我们将直线以斜率为第一关键字,截距为第二关键字从大到小排序;
然后从前往后枚举直线,加入单调栈。
当单调栈内直线数量 \(\ge\) 2时,设 \(l_1\) 与 \(l_2\) 为栈顶两直线,\(L\) 为枚举直线,用一元二次方程算出 \(L\) 与 \(l_1\) , \(l_1\) 与 \(l_2\) 的交点横坐标 \(x_1\),\(x_2\) 。若 \(x_2>x_1\) ,则 \(l_1\) 已经被覆盖,退栈,重复该操作到 \(x_2<x_1\) 或栈中只剩一条直线。
#include <bits/stdc++.h>
#define ll long long
#define rgi register int
using namespace std;
const int M=5e4+7;
inline int read(){
int w=0,r=1;char c=getchar();
while(!(isdigit(c)||c=='0'))c=getchar();
if(c=='-')r=-1,c=getchar();
while(isdigit(c))w=w*10+c-'0',c=getchar();
return w*r;
}
int n,m,stk[M],ans[M],cnt;double a,b,r;
struct l{
int ii;double k,b;
}p[M];
bool cmp(l aa,l bb){
return aa.k>bb.k||(aa.k==bb.k&&aa.b>bb.b);
}
double xx(int aa,int bb){
return (double)(p[bb].b-p[aa].b)/(p[aa].k-p[bb].k);
}
int main(){
n=read();
for(int i=1;i<=n;i++){
scanf("%lf%lf",&p[i].k,&p[i].b);
p[i].ii=i;
}
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++){
if(p[i].k==p[stk[cnt]].k&&i>1)continue;
while(cnt>=2&&xx(stk[cnt-1],stk[cnt])<=xx(stk[cnt],i))cnt--;
stk[++cnt]=i;
ans[cnt]=p[i].ii;
}
sort(ans+1,ans+cnt+1);
for(int i=1;i<=cnt;i++)printf("%d ",ans[i]);
printf("\n");
return 0;
}
/*
3
-1 0
1 0
0 0
*/
原文地址:https://www.cnblogs.com/wcy2006/p/15100864.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 算法实现,用机器学习模拟一个opencv的边缘识别算法
- 开源公共组件仓库的更新日志应该如何写
- 判断ABAP代码是否处于update模式下运行的工具类
- SAP CRM WebClient UI异常的持久化机制
- 在ABAP Webdynpro里显示PDF的一种办法
- ABAP Webdynpro Interface View的用法
- ABAP Webdynpro里Component Usage的用法
- ABAP Webdynpro - 如何使用用户自定义的value help
- ABAP 740的新语法 - 使用BO association的方式进行内表连接操作
- 使用代码修改SAP CRM附件的属性
- SAP CRM附件创建的internal模式是什么含义
- 搭建maven私服上传并使用Jar包
- Docker 容器跨主机多网段通信解决方案
- Docker 容器实现数据持久化
- mongodb----复制