USACO09MAR Look Up

题目地址

题解

暴力肯定行不通,考虑到无用元素的去除以及单调性的维护,我们使用单调栈这一数据结构。
实际上这题跟06年那道题一个意思,
所以要看的话可以去前面找一下我写的另一篇题解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
using namespace std;
int n,s[100005][2],dat[100005],top=0,ans[100005];
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&dat[i]);
s[top][0]=dat[n-1],
s[top++][1]=n-1,
ans[n-1]=-1;
for(int i=n-2;i>=0;i--){
while(top&&dat[i]>=s[top-1][0])
top--;
if(!top)ans[i]=-1;
else ans[i]=s[top-1][1];
s[top][0]=dat[i],
s[top++][1]=i;
}
for(int i=0;i<n;i++)
printf("%d\n",ans[i]+1);
return 0;
}