Leyni,罗莉和队列 | ||||||
|
||||||
Description | ||||||
Leyni喜欢跟罗莉们一起玩,他已经将罗莉按照身高(她们的身高都不相同)排成一行列,高的在前,矮的在后。可是对于每个罗莉来说,如果她的前面(即身高比她高的)有比她年龄小的,她就会不高兴,这个不高兴程度可以用一个数值来衡量,这个数值等于在她前面而且年龄比她小的人中最靠前的那个人与她之间相隔的人数。 |
||||||
Input | ||||||
本题有多组测试数据,输入的第一行是一个整数T代表着测试数据的数量,接下来是T组测试数据。 对于每组测试数据: 第1行 包含一个整数n (2 ≤ n ≤ 105)代表着罗莉的数量。 第2行 按照身高从低到高的顺序给出以空格分隔的n个整数ai (1 ≤ ai ≤ 109),代表着每个罗莉的年龄。 |
||||||
Output | ||||||
对于每组测试数据: 第1行 按照身高从低到高的顺序输出以空格分隔的n个整数,代表着每个罗莉的不高兴程度,对于没有不高兴的罗莉,输出-1。 |
||||||
Sample Input | ||||||
2 6 10 8 5 3 50 45 5 10 3 1 10 11 |
||||||
Sample Output | ||||||
2 1 0 -1 0 -1 10 -1 -1-1 |
||||||
Author | ||||||
齐达拉图@HRBUST |
思路:先对序列排序,然后按年龄从小到大扫一遍,扫的同时用一个变量维护比当前年龄小的最大id,就可以直接求出答案了
例如 :10(1) 3(2) 8(3) 1(4) 2(5)
排序后为10(1) 8(3) 3(2) 2(5) 1(4)
从1开始往前扫,因为维护的id是比当前年龄小的最大id,所以可以保证每次都能找到在原序列中比当前数小且距离最远的数的id
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct data
{
int x;
int id;
int ans;
}a[100005];
int cmp1(data a,data b)
{
return a.x==b.x?a.id>b.id:a.x>b.x;
}
int cmp2(data a,data b)
{
return a.id<b.id;
}
int main()
{
int t;
while(~scanf("%d",&t))
while(t--)
{
int n;
scanf("%d",&n);
for (int i=1;i<=n;++i)
{
scanf("%d",&a[i].x);
a[i].id=i;
}
sort(a+1,a+1+n,cmp1);
a[n].ans=-1;
int mi=a[n].id;
for (int i=n-1;i>=1;--i)
{
if (a[i].id<mi)
a[i].ans=mi-a[i].id-1;
else
a[i].ans=-1;
mi=max(mi,a[i].id);
}
sort(a+1,a+1+n,cmp2);
for (int i=1;i<=n;++i)
printf("%d%c",a[i].ans,i!=n?' ':'\n');
}
}