P3194 [HNOI2008]水平可見直線 計算幾何棧維護下凸殼
阿新 • • 發佈:2020-07-23
題解:
按斜率和截距排序,斜率第一關鍵字,
若新加入的直線能覆蓋原來的直線,就把原來的直線從棧中去掉
平面問題 手玩一下
程式碼
#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,inty) { 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; }