博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HNOI2008]水平可见直线
阅读量:7232 次
发布时间:2019-06-29

本文共 1039 字,大约阅读时间需要 3 分钟。

看似一个半平面交

但是一般的半平面交用求的是凸包,这个是一个凸壳。封闭区间和半开放区间还是有区别的。

当然一般的半平面交其实可以,只要把向量的方向设对即可(只有1/4象限的向量)

 

但是既然直接给了斜率的话,而且半开放的区间,还有一个简单一些的做法:

考虑直线按照斜率排序,斜率相同纵截距排序

两个栈,一个维护交点,一个维护直线

加入一个直线,如果和最后一个直线的交点在前一个交点的左方(或者重合),那么这个直线和交点都被盖住了。

不断一起弹栈

画个图就很好理解。

O(nlogn+n)

#include
#define reg register int#define il inline#define numb (ch^'0')using namespace std;typedef long long ll;il void rd(int &x){ char ch;x=0;bool fl=false; while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true); for(x=numb;isdigit(ch=getchar());x=x*10+numb); (fl==true)&&(x=-x);}namespace Miracle{const int N=50000+5;struct po{ double x,y; bool friend operator <(po a,po b){ if(a.x!=b.x) return a.x
=b.y; }}sta[N];int top1;int n;struct line{ int k,b; int id; bool friend operator <(line a,line b){ if(a.k==b.k) return a.b>b.b; return a.k
n) break; while(top1&&calc(l[i],zhan[top2])
View Code

 

一个不错的应用题是:

转化之后就是横着的“水平可见直线”

 

转载于:https://www.cnblogs.com/Miracevin/p/10182519.html

你可能感兴趣的文章
OpenCl工作组
查看>>
Angular 学习笔记——$interpolate
查看>>
Javascript模块化编程之Why
查看>>
2016/4/5 对象
查看>>
[反射]通用方法 命名空间,类,对象,属性
查看>>
递归的代价
查看>>
SPOJ Problem 5699:The last digit re-visited
查看>>
selenium设置proxy、headers(phantomjs、Chrome、Firefox)
查看>>
润乾报表参数乱码问题
查看>>
谷歌提出新的字体调用方案帮助提高中文字体的加载速度
查看>>
太牛X了!神奇的故事 你猜得到开头,却猜不到结尾
查看>>
图片的三级缓存
查看>>
svm原理及opencv
查看>>
Android 自定义RadioButton的样式
查看>>
bzoj 3456 城市规划——分治FFT / 多项式求逆 / 多项式求ln
查看>>
bzoj1042硬币购物
查看>>
(3)pyspark----dataframe观察
查看>>
MFC 使用位图按钮,并且设置按钮的鼠标悬停效果
查看>>
ceph存储之查找对象
查看>>
IE7下浮动(float)层不能实现环绕的问题
查看>>