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,罗莉和队列 题解报告的主要内容,如果未能解决你的问题,请参考以下文章
[bzoj1356]Rectangle[Baltic2009][几何常识乱搞]