题目链接
题目描述
你有一个长度为 的正整数序列 ,第 个数字为。
你要输出 个数字,设 为最大的数字,使得 。如果 ,则你输出的第 个数字为 ,否则输出 。(若这种 不存在也输出 )
(或者说,对于每个 若 的右边不存在比它小的数字则输出 ,否则找到最靠右的一个小于 的 ,输出 。)
输入格式
第一行一个数 ,表示序列长度。
第二行 个数,第 个数为 ,代表序列中的第 个数字。
输出格式
一行 个数,要求如题面。
样例
样例输入 1
6 10 8 5 3 50 45
样例输出 1
2 1 0 -1 0 -1
样例输入 2
7 10 4 6 3 2 8 15
样例输出 2
4 2 1 0 -1 -1 -1
样例输入 3
5 10 3 1 10 11
样例输出 3
1 0 -1 -1 -1
数据范围与提示
对于 数据 , ,
对于 数据 , ,
对于 数据 , ,
对于所有数据 , ,
解题思路
本题先全部遍历一遍,但这样可能会超时。这里有一个小技巧(先从后面遍历,老师出题都很坑,会让你遍历到最后一个)(9,10测试点),所以这题也没什么好说的。遍历一遍,从最后开始,一个一个遍历(我是这么写的)(bushi)
不知道有什么更好的方法,蒟蒻的。
代码实现
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
int main() {
freopen("number.in", "r", stdin);
freopen("number.out", "w", stdout);
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n - 1; i++) {
bool flag = 0;
for (int j = n - 1; j > i; j--) {
if (a[j] < a[i]) {
cout << j - i - 1 << " ";
flag = 1;
break;
}
}
if (!flag)
cout << -1 << " ";
}
cout << -1 << endl;
return 0;
}
反正过了(bushi)