题目描述
乐乐做完数学作业,突发奇想定义了一种新的数:乐乐数。乐乐把n个数排成一行,一个数的“乐乐数”是指:在这个数的左边且比它小的数中最靠近它(即最靠右)的那个数。依次给出这n个数,请求出所有这n个数相对应的“乐乐数”。
输入
第一行是一个正整数n,表示一共有多少个数。
第二行有n个用空格隔开的正整数,它们从左至右给出了数列中的n个数。这些数保证小于231。
输出
输出一行用空格隔开的n个数。
这些数对应于输入数据中的数的“乐乐数”。如果输入中某个数没有“乐乐数”(即它左边的数都不比它小),请输出0。
样例输入 Copy
7 3 1 2 7 6 7 4
样例输出 Copy
0 0 1 2 2 6 2
提示
对于80%的数据,n≤10000;
对于100%的数据,n≤200000。
#include <iostream>
#include <stdio.h>
using namespace std;
typedef long long LL;
const int N = 200010;
LL n, ans = 1, res, a2, a5, a10, t;
LL a[N], b[N];
signed main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
for(int i = 1; i <= n; i ++ )
{
if(i == 1)
{
b[i] = 0;
continue;
}
if(a[i] > a[i - 1]) b[i] = a[i - 1];
else
{
if(b[i - 1] < a[i]) b[i] = b[i - 1];
else
{
int j = i - 2;
while(a[j] >= a[i] && b[j] >= a[i])
{
j --;
}
if(a[j] < a[i]) b[i] = a[j];
if(b[j] < a[i]) b[i] = b[j];
}
}
}
for(int i = 1; i <= n; i ++ ) cout << b[i] << " ";
cout << endl;
}