水平可见直线-半平面交,单调栈
题目描述

题解
按照斜率为第一关键字,截距为第二关键字对直线进行排序,发现最后的可见直线必然构成一个斜率递增的下凸壳(如下图),于是单调栈维护

代码实现
#include<bits/stdc++.h>
#define M 100009
using namespace std;
struct line{
double x,y;
int id;
}a[M];
int top,ans[M],q[M],n;
bool cmp(const line &a,const line &b){
if(a.x==b.x) return a.y>b.y;
return a.x>b.x;
}
double inter(int x,int y){
return (a[y].y-a[x].y)*1.0/(a[x].x-a[y].x);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lf%lf",&a[i].x,&a[i].y);
a[i].id=i;
}sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
if(a[i].x==a[i-1].x&&i!=1) continue;
while(top>1&&inter(q[top],i)>=inter(q[top],q[top-1])) top--;
q[++top]=i;
ans[top]=a[i].id;
}sort(ans+1,ans+top+1);
for(int i=1;i<=top;i++) printf("%d ",ans[i]);
return 0;
}

本文详细解析了水平可见直线与半平面交集的算法,通过使用单调栈来维护斜率递增的下凸壳,实现对直线集合的有效处理。介绍了如何通过排序和比较直线斜率与截距,结合栈结构筛选出最终可见的直线集合。
624

被折叠的 条评论
为什么被折叠?



