zoukankan      html  css  js  c++  java
  • 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 }
    代码戳这里
  • 相关阅读:
    课时28:文件:因为懂你,所以永恒
    课时27:集合:在我的世界里,你就是唯一
    课时26:字典:各种内置方法
    课时25:字典:当索引不好用时
    课时24:递归:汉诺塔
    课时23:递归:这帮小兔崽子
    课时22:函数:递归是神马
    有序表查找-折半查找
    C#
    C#
  • 原文地址:https://www.cnblogs.com/THWZF/p/11424434.html
Copyright © 2011-2022 走看看