半平面交模板(BZOJ1007)

时间:2023-12-02 21:40:14
#include<cstdio>
#include<algorithm>
#define LDB long double
using namespace std; int ans[];
struct lin{
LDB k,b;
int num;
}a[]; struct rec{
LDB inte;
int num;
}sta[]; int mycomp(const lin &a,const lin &b){
if (a.k<b.k) return();
if (a.k>b.k) return();
if (a.b>b.b) return();
return();
} LDB inter(lin a,lin b){
return((b.b-a.b)/(a.k-b.k));
} int main(){
int n;
scanf("%d",&n); for (int i=;i<=n;i++){
int t1,t2;
scanf("%d%d",&t1,&t2);
a[i].k=(LDB)t1;a[i].b=(LDB)t2;a[i].num=i;
} sort(a+,a+n+,mycomp);
int top;
sta[top=].num=;sta[top].inte=-;
for (int i=;i<=n;i++)
if (a[i].k!=a[i-].k){
while ((top>)&&(inter(a[i],a[sta[top].num])<=sta[top].inte)) top--;
sta[++top].num=i;
sta[top].inte=inter(a[i],a[sta[top-].num]);
} for (int i=;i<=top;i++) ans[i]=a[sta[i].num].num;
sort(ans+,ans+top+);
for (int i=;i<=top;i++) printf("%d ",ans[i]);
}