记录编号 262888 评测结果 AAAAAAAAAAAA
题目名称 [USACO Mar09] 向右看齐 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 0.098 s
提交时间 2016-05-21 22:07:28 内存使用 11.73 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;

const int maxl=1000010;
int h[maxl],ans[maxl],n,i,j,q[maxl],head,tail;

int find(int x,int l,int r){
	if (l==r) return q[l];
	int m=(l+r)/2;
	if (h[q[m+1]]>x) return find(x,m+1,r);
		else return find(x,l,m);
}

int main()
{
	freopen("lookup.in","r",stdin);
	freopen("lookup.out","w",stdout);
	scanf("%d",&n);
	for (i=1;i<=n;i++) scanf("%d",&h[i]);
	head=1;tail=0;
	for (i=n;i>0;i--){
		ans[i]=(h[i]<h[q[head]]?find(h[i],head,tail):0);
		for (;head<=tail&&h[i]>=h[q[tail]];tail--);
		q[++tail]=i;
	}
	for (i=1;i<=n;i++) printf("%d\n",ans[i]);
	return 0;
}