• 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 }
    代码戳这里
  • 相关阅读:
    pat甲级 1155 Heap Paths (30 分)
    pat甲级 1152 Google Recruitment (20 分)
    蓝桥杯 基础练习 特殊回文数
    蓝桥杯 基础练习 十进制转十六进制
    蓝桥杯 基础练习 十六进制转十进制
    蓝桥杯 基础练习 十六进制转八进制
    51nod 1347 旋转字符串
    蓝桥杯 入门训练 圆的面积
    蓝桥杯 入门训练 Fibonacci数列
    链表相关
  • 原文地址:https://www.cnblogs.com/THWZF/p/11424434.html
Copyright © 2020-2023  润新知