您的位置:首页 > 其它

hrbust 1356Leyni,罗莉和队列

2017-06-23 14:12 239 查看
Leyni,罗莉和队列
Time Limit: 1000 MSMemory Limit: 65536 K
Total Submit: 137(35 users)Total Accepted: 41(28 users)Rating: 







Special Judge: No
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
.ans=-1;
int mi=a
.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');
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: