原题 p5788
题目背景
模板题,无背景。
2019.12.12 更新数据,放宽时限,现在不再卡常了。
题目描述
给出项数为 𝑛n 的整数数列 𝑎1…𝑛a1…n。
定义函数 𝑓(𝑖)f(i) 代表数列中第 𝑖i 个元素之后第一个大于 𝑎𝑖ai 的元素的下标,即 𝑓(𝑖)=min𝑖<𝑗≤𝑛,𝑎𝑗>𝑎𝑖{𝑗}f(i)=mini<j≤n,aj>ai{j}。若不存在,则 𝑓(𝑖)=0f(i)=0。
试求出 𝑓(1…𝑛)f(1…n)。
输入格式
第一行一个正整数 𝑛n。
第二行 𝑛n 个正整数 𝑎1…𝑛a1…n。
输出格式
一行 𝑛n 个整数表示 𝑓(1),𝑓(2),…,𝑓(𝑛)f(1),f(2),…,f(n) 的值。
输入输出样例
输入 #1复制
5 1 4 2 3 5
输出 #1复制
2 5 4 5 0
说明/提示
【数据规模与约定】
对于 30%30% 的数据,𝑛≤100n≤100;
对于 60%60% 的数据,𝑛≤5×103n≤5×103 ;
对于 100%100% 的数据,1≤𝑛≤3×1061≤n≤3×106,1≤𝑎𝑖≤1091≤ai≤109。
AC
#include<iostream>
using namespace std;
const int N=3e6+3;
int a[N],s[N],ans[N];
int top=0,bot=1,n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=n;i>0;i--){
while(top&&a[s[top]]<=a[i]) top--;
if(top==0) ans[i]=0;
else ans[i]=s[top];
s[++top]=i;
}
for(int i=1;i<=n;i++) printf("%d ",ans[i]);
return 0;
}