记录编号 107074 评测结果 AAAAAAAAAA
题目名称 [JLOI 2013] 赛车 最终得分 100
用户昵称 Gravatarraywzy 是否通过 通过
代码语言 C++ 运行时间 0.041 s
提交时间 2014-06-22 14:07:19 内存使用 0.66 MiB
显示代码纯文本
#include<fstream>
#include<algorithm>
#include<cmath>
using namespace std;
ifstream fin("race1.in");
ofstream fout("race1.out");
class New
{
public:int number;int k;int s;
}A[10001];
int Stack[10001]; int D[10001],F[10001];
New a[10001];
int ZZ=0,N;
void push(int a)
{
	ZZ++;Stack[ZZ]=a;
}
void pop()
{
	ZZ--;
}
bool Rule(New a,New b)
{
	if(a.k<b.k)
		return 1;
	if(a.k==b.k && a.s<b.s)return 1;
	return 0;
}
int main()
{
	bool flag=0;
	bool p=0;
	int i,B,C; fin>>N;
	//统计交点个数以及其x坐标,用F数组表示,sum计数
	int sum=0;
	double F[10001];
	double LSX=0,temp;
	for(i=1;i<=N;i++)
		fin>>D[i];
	for(i=1;i<=N;i++)
		fin>>F[i];
	for(i=1;i<=N;i++)
	{
		a[i].s=D[i];
		a[i].k=F[i];
		A[i].number=i;
		A[i].s=D[i];
		A[i].k=F[i];
	}
	sort(A+1,A+N+1,Rule);
	for(i=1;i<=N;i++)
	{
		if(ZZ==0)
		{
			push(A[i].number);
		    continue;
		}
/*	    while(a[A[i].number].k==a[Stack[ZZ]].k)
		{
			p=1;
			if(a[A[i].number].s>a[Stack[ZZ]].s)
			{
				pop;
				push(A[i].number);
			}
		}*/
		temp=double((a[Stack[ZZ]].s*1.0-a[A[i].number].s*1.0)/(a[A[i].number].k*1.0-a[Stack[ZZ]].k*1.0));//计算当前枚举的直线与栈顶直线交点
		if(temp>=F[sum])
		{
			sum++;F[sum]=temp;
			push(A[i].number);
			continue;
		}
		else
		{
			while(temp<F[sum])
			{
				pop();
				if(ZZ==0)
				{
					push(A[i].number);
					flag=1;
					break;
				}
				sum--;
				temp=double((a[Stack[ZZ]].s*1.0-a[A[i].number].s*1.0)/(a[A[i].number].k*1.0-a[Stack[ZZ]].k*1.0));
			}
			if(flag==1)
			{
				flag=0;
				continue;
			} 
			sum++;
			F[sum]=temp;
			push(A[i].number);
		}
	}
	fout<<ZZ<<endl;
	sort(Stack+1,Stack+ZZ+1);
	for(i=1;i<=ZZ;i++)
		fout<<Stack[i]<<' ';
	return 0;
}