hrbust 1356Leyni,罗莉和队列

Leyni,罗莉和队列
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submit: 137(35 users) Total Accepted: 41(28 users) Rating:  Special Judge: No
Description

Leyni喜欢跟罗莉们一起玩,他已经将罗莉按照身高(她们的身高都不相同)排成一行列,高的在前,矮的在后。可是对于每个罗莉来说,如果她的前面(即身高比她高的)有比她年龄小的,她就会不高兴,这个不高兴程度可以用一个数值来衡量,这个数值等于在她前面而且年龄比她小的人中最靠前的那个人与她之间相隔的人数。

Input

本题有多组测试数据,输入的第一行是一个整数T代表着测试数据的数量,接下来是T组测试数据。

对于每组测试数据:

1 包含一个整数(2 ≤ n ≤ 105)代表着罗莉的数量。

2 按照身高从低到高的顺序给出以空格分隔的n个整数a(1 ≤ ai ≤ 109),代表着每个罗莉的年龄。

Output

对于每组测试数据:

1 按照身高从低到高的顺序输出以空格分隔的n个整数,代表着每个罗莉的不高兴程度,对于没有不高兴的罗莉,输出-1

Sample Input

2

6

10 8 5 3 50 45

扫描二维码关注公众号,回复: 2690410 查看本文章

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');
    }
}


猜你喜欢

转载自blog.csdn.net/qq_38000095/article/details/73645068