tm数组记录原始数据
b数组记录的是 从i到 n里面 最小的一个数
对tm[i],如果 b[i+1]都大于等于它,则i位置前面不可能会有比tm[i]小的数,输出-1
如果tm[i]>b[i+1]的话,答案必然是在 b 的i+1到 bn 之间, 因为b是有序的,那么就二分查找就好
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<string.h>
#include<stack>
#include<queue>
#define MAX 100005
#define inf 0x3f3f3f3f
using namespace std;
int tm[100000+5];
int b[100000+5];
int main()
{
int n;
scanf("%d",&n);
int i;
for (i=1;i<=n;i++)
{
scanf("%d",&tm[i]);
}
int minn=tm[n];
for (i=n;i>=1;i--)
{
if (tm[i]<minn)
minn=tm[i];
b[i]=minn;<span style="white-space:pre"> </span>//b时刻记录i~n中最小的数
}
for (i=1;i<=n;i++)
{
if (i!=1) printf(" ");
if (tm[i]<=b[i+1])<span style="white-space:pre"> </span>//如果b[i+1]>=tm[i] 则tm[i]前面不会有比它小的数了,-1
printf("-1");
else
printf("%d",upper_bound(b+i+2,b+n+1,tm[i])-&b[i]-2); //二分找到第一个大于等于tm[i]的数 他的前一个就是答案,即tm[I]对应最远的数
}
printf("\n");
return 0;
}