记录编号 141483 评测结果 AAAAAAAAAA
题目名称 [HNOI 2008]水平可见直线 最终得分 100
用户昵称 GravatarAsm.Def 是否通过 通过
代码语言 C++ 运行时间 0.080 s
提交时间 2014-12-01 23:23:32 内存使用 1.51 MiB
显示代码纯文本
#include <cctype>
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <assert.h>
using namespace std;
inline void getd(int &x){
	char c = getchar(); bool minus = 0;
	while(!isdigit(c) && c != '-')c = getchar();
	if(c == '-')minus = 1, c = getchar();
	x = c - '0';
	while(isdigit(c = getchar()))x = x * 10 + c - '0';
	if(minus)x = -x;
}
/*========================================================*/
const int maxn = 50003;
typedef long long LL;
int N;
struct Line{
	int id;
	int A, B;
}line[maxn], St[maxn];
bool operator < (const Line &a, const Line &b){return b.A > a.A;}
inline void init(){
	getd(N);int i;
	for(i = 1;i <= N;++i)
		getd(line[i].A), getd(line[i].B), line[i].id = i;
	sort(line + 1, line + N + 1);
}
int it = 0;
bool inS[maxn];
inline void work(){
	int i;
	St[it++] = line[1];
	for(i = 2;i <= N;++i){
		if(line[i].A == St[it-1].A){
			if(line[i].B > St[it-1].B)
				St[it-1] = line[i];
			else continue;
		}
		while(it > 1){
			LL a = (LL)(St[it-2].B - St[it-1].B) * (line[i].A - St[it-1].A);
			LL b = (LL)(St[it-1].B - line[i].B) * (St[it-1].A - St[it-2].A);
			if(a >= b)--it;
			else break;
		}
		St[it++] = line[i];
	}
	while(it)inS[St[--it].id] = 1;
	for(i = 1;i <= N;++i)
		if(inS[i]) printf("%d ", i);
}
int main(){
	#if defined DEBUG
	freopen("test", "r", stdin);
	#else
	freopen("bzoj_1007.in", "r", stdin);
	freopen("bzoj_1007.out", "w", stdout);
	#endif
	init();
	work();
	
	return 0;
}