P3194 [HNOI2008]水平可见直线 计算几何栈维护下凸壳

题解:

按斜率和截距排序,斜率第一关键字,

若新加入的直线能覆盖原来的直线,就把原来的直线从栈中去掉

平面问题 手玩一下

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
struct dot
{
    int x,y;
    int id;
}
a[maxn];
bool cmp(dot x,dot y)
{
    if(x.x==y.x)
        return x.y>y.y;
    return x.x>y.x;
}
double jiao(int x,int y)
{
    return 1.0*(a[y].y-a[x].y)/(1.0*(a[x].x-a[y].x));
}
bool cmp1(int x,int  y)
{
    return a[x].id<a[y].id;
}
int _stack[maxn];
int top;
int main(){
   int n;
   cin>>n;
   for(int i=1;i<=n;i++) {cin>>a[i].x>>a[i].y;a[i].id=i;}
   sort(a+1,a+1+n,cmp);
   for(int i=1;i<=n;i++)
   {   
       if(i!=1&&a[i].x==a[i-1].x) continue;
       while(top>1&&jiao(i,_stack[top])>=jiao(_stack[top],_stack[top-1])) top--;
       _stack[++top]=i;
   }
   sort(_stack+1,_stack+1+top,cmp1);
   for(int i=1;i<=top;i++)
   {
       cout<<a[_stack[i]].id<<' ';
   }
   cout<<endl;
}
原文地址:https://www.cnblogs.com/acmLLF/p/13365265.html