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

Posted thwzf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 
代码戳这里

以上是关于HRBUST1356 Leyni,罗莉和队列 题解报告的主要内容,如果未能解决你的问题,请参考以下文章

HRBUST 1313 火影忍者之~静音

HRBUST - 1371 大模拟

[bzoj1356]Rectangle[Baltic2009][几何常识乱搞]

Prime Independence LightOJ - 1356 (HK 最大独立集 板子)

MySQL查看定义者权限和错误1356

hrbust1140 数字和问题