记录编号 420488 评测结果 AAAAAAAAAA
题目名称 [HNOI 2008]水平可见直线 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 0.102 s
提交时间 2017-07-04 21:40:56 内存使用 1.63 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=50010;
struct line{
	int id,k,b;
	line(int ID=0,int K=0,int B=0){
		id=ID;k=K;b=B;
	}
	line operator - (const line &x)const{return line(0,k-x.k,b-x.b);}
	ll operator * (const line &x)const{return (ll)k*x.b-(ll)b*x.k;}
}l[N],q[N];
bool cmp(const line &x,const line &y){
	return x.k==y.k?x.b>y.b:x.k<y.k;
}
bool check(line x,line y,line z){
	return (y-x)*(z-x)>=0;
}
int n,tail,a[N];
int main()
{
	freopen("bzoj_1007.in","r",stdin);
	freopen("bzoj_1007.out","w",stdout);
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d%d",&l[i].k,&l[i].b),l[i].id=i;
	sort(l+1,l+n+1,cmp);
	l[0].k=-1e9;
	tail=0;
	for (int i=1;i<=n;i++)
	if (l[i].k!=l[i-1].k){
		for (;1<tail&&check(q[tail-1],q[tail],l[i]);tail--);
		q[++tail]=l[i];
	}
	int cnt=0;
	for (int i=1;i<=tail;i++) a[++cnt]=q[i].id;
	sort(a+1,a+cnt+1);
	for (int i=1;i<=cnt;i++) printf("%d ",a[i]);
	puts("");
	return 0;
}