P3194 [HNOI2008] 水平可见直线 - 洛谷
不过·只有90%
#include<bits/stdc++.h>
using namespace std;
#define N 100011
typedef long long ll;
typedef pair<ll,int> pii;
int n;
struct no
{double k,b;int id;
}a[N],an[N];
int k;
bool cmp(no a,no b)
{if(a.k==b.k) return a.b<b.b;return a.k<b.k;
}
double cross(double ax,double ay,double bx,double by)
{return ax*by-ay*bx;
}
int t;
void andrew()
{an[0]=a[0];k=1;for(int i=0;i<n;i++){while(k>1&&cross(an[k-1].k-an[k-2].k,an[k-1].b-an[k-2].b,a[i].k-an[k-1].k,a[i].b-an[k-1].b)<=1e-6){k--;}an[k++]=a[i];///只求上凸包 }t=k;for(int i=n-2;i>=0;i--){while(k>t&&cross(an[k-1].k-an[k-2].k,an[k-1].b-an[k-2].b,a[i].k-an[k-1].k,a[i].b-an[k-1].b)<=1e-6){k--;}an[k++]=a[i];///只求上凸包 }
}
bool cc(no a,no b)
{return a.id<b.id;
}
int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;for(int i=0;i<n;i++){cin>>a[i].k>>a[i].b;a[i].id=i+1; }sort(a,a+n,cmp);andrew();sort(an+t-1,an+k,cc);for(int i=t-1;i<k;i++) cout<<an[i].id<<" ";return 0;
}