HRBUST1356 Leyni,罗莉和队列 题解报告

题目传送门

【题目大意】

【思路分析】

维护一个在身高单调递减的情况下,年龄也单调递减的序列,如果当前不满足递减,那么就要在前面存好的序列中找到年龄比当前小的最高的人并记录答案,找到符合条件的人可以用二分快速实现。

【代码实现】

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define rg register
 5 #define il inline
 6 #define get getchar()
 7 #define go(i,a,b) for(rg int i=a;i<=b;i++)
 8 #define back(i,a,b) for(rg int i=a;i>=b;i--)
 9 #define pf printf
10 #define db double
11 #define sf scanf
12 #define ll long long
13 #define mem(a,b) memset(a,b,sizeof(a))
14 using namespace std;
15 const int N=1e5+2;
16 const int INF=1e9+7;
17 int T,n,num,a[N],sad[N];
18 il int fr(){
19     int w=0,q=1;
20     char ch=get;
21     while(ch<'0'||ch>'9'){
22         if(ch=='-') q=-1;
23         ch=get;
24     }
25     while(ch>='0'&&ch<='9') w=(w<<1)+(w<<3)+ch-'0',ch=get;
26     return w*q;
27 }
28 struct loli{
29     int age,id;
30 }l[N];
31 il int work(rg int x){//找到年龄小于x的最高的人
32     rg int L=1,R=num+1,ans;
33     while(L<=R){//二分
34         rg int mid=(L+R)>>1;
35         if(l[mid].age<x) ans=l[mid].id,R=mid-1;
36         else L=mid+1;
37     }
38     return ans;
39 }
40 int main(){
41     T=fr();l[0].age=INF;
42     while(T--){
43         n=fr();num=0;
44         go(i,1,n) a[i]=fr();//按照身高从低到高输入年龄
45         back(i,n,1){//按照身高从高到低操作
46             if(a[i]<l[num].age) l[++num]=(loli){a[i],i},sad[i]=-1;
47             //保证记录的序列单调递减
48             else if(a[i]==l[num].age) sad[i]=-1;
49             else l[num+1].age=INF,sad[i]=work(a[i])-i-1;
50             //遇到不递减的,就要记录答案
51         }
52         go(i,1,n-1) pf("%d ",sad[i]);
53         pf("%d",sad[n]);puts("");
54     }
55     return 0;
56 }
代码戳这里
原文地址:https://www.cnblogs.com/THWZF/p/11424434.html