裸半平面交
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define maxn 50021
using namespace std;
int n,ans[maxn],cnt;
struct Line{
double k,b;int id;
bool operator<(const Line& y)const{
return k==y.k ? b>y.b : k<y.k;
}
}l[maxn],q[maxn];
struct P{
double x,y;
P(double a=0,double b=0):x(a),y(b){}
};
P Q(Line a,Line b){
double k1=a.k,k2=b.k,b1=a.b,b2=b.b;
double x=(b1-b2)/(k2-k1);
double y=k1*x+b1;
return P(x,y);
}
bool judge(Line a,Line b,Line t){
P x=Q(a,t);
return x.x*b.k+b.b<=x.y;
}
void solve(){
q[1]=l[1],q[2]=l[2];
int L=1,R=2;
for(int i=3;i<=cnt;i++){
while(L<R&&judge(q[R-1],q[R],l[i]))R--;
while(L<R&&judge(q[L],q[L+1],l[i]))L++;
q[++R]=l[i];
}
for(int i=L;i<=R;i++){
ans[q[i].id]=1;
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&l[i].k,&l[i].b),l[i].id=i;
sort(l+1,l+1+n);
for(int i=1;i<=n;i++){
if(l[i].k!=l[i-1].k||i==1)l[++cnt]=l[i];
}solve();
for(int i=1;i<=n;i++)if(ans[i])printf("%d ",i);
return 0;
}