• acwing周赛 排队问题--二分+单调栈的思想


    项目场景:

    二分+单调栈


    问题描述

    n 个小朋友排成一排,从左到右依次编号为1∼n。

    第 i个小朋友的身高为 hi。

    虽然队伍已经排好,但是小朋友们对此并不完全满意。

    对于一个小朋友来说,如果存在其他小朋友身高比他更矮,却站在他右侧的情况,该小朋友就会感到不满。

    每个小朋友的不满程度都可以量化计算,具体来说,对于第 i 个小朋友:

    • 如果存在比他更矮且在他右侧的小朋友,那么他的不满值等于其中最靠右的那个小朋友与他之间的小朋友数量。
    • 如果不存在比他更矮且在他右侧的小朋友,那么他的不满值为 −1。

    请你计算并输出每个小朋友的不满值。

    注意,第 1个小朋友和第 2 个小朋友之间的小朋友数量为 0,第 1 个小朋友和第 4 个小朋友之间的小朋友数量为 2。

    输入格式

    第一行包含整数 n。

    第二行包含 n 个整数 h1,h2,…,hn。

    输出格式

    共一行,输出 n 个整数,第 i个整数为第 i个小朋友的不满值。

    数据范围

    前 55 个测试点满足2≤n≤5。
    所有测试点满足 2≤n≤105,1≤hi≤109。

    输入样例1:

    1. 6
    2. 10 8 5 3 50 45

    输出样例1:

    2 1 0 -1 0 -1
    

    输入样例2:

    1. 7
    2. 10 4 6 3 2 8 15

    输出样例2:

    4 2 1 0 -1 -1 -1 
    

    输入样例3:

    1. 5
    2. 10 3 1 10 11

    输出样例3:

    1 0 -1 -1 -1 

    算法分析:

    从左到右扫描数组,生成一个单调递增栈(栈中保存下标),任何一数 x 的答案,一定在栈中。

    单调栈中保存的是数组下标,且下标对应的数组中的数字递增。所以,对于数组中的数字 x ,可以用二分法找到答案。

    答案就是:在递增数组中,二分找出比 x 小的最大数。


    实现代码:

    1. #include
    2. using namespace std;
    3. const int N = 100010;
    4. int w[N];
    5. int n;
    6. int st[N];
    7. int ans[N];
    8. int top = 0;
    9. int main(){
    10. int n;
    11. cin>>n;
    12. //从左到右构造一个单调递增的栈
    13. for(int i=0;i
    14. cin>>w[i];
    15. while(top>0 && w[i]
    16. top--;
    17. }
    18. st[++top] = i;//元素入栈
    19. }
    20. //在构造的单调栈中通过二分找出答案
    21. for(int i=0;i
    22. int l =0,r = top;
    23. while(l
    24. int mid = l+r+1>>1;
    25. //因为要找的答案是小于x的数 所以这里的判断语句只能是大于等于 取不到mid这个点
    26. //所以要找的答案一定在mid左边 取不到mid这个点 r = mid-1
    27. if(w[st[mid]]>=w[i]) r = mid-1;
    28. else l = mid;
    29. }
    30. //要找到特定答案必须有两个条件 1.这个点在指定元素的右边 2.这个点的值小于指定元素
    31. if(st[r]>i && w[st[r]]-1<<" ";
    32. else cout<<"-1"<<" ";
    33. }
    34. return 0;
    35. }

  • 相关阅读:
    Elasticsearch - Elasticsearch 8.X;Elasticsearch 8.X集群(十)
    【USRP】产品型号、参数、架构全解析系列 9:X410
    Django-(3)
    华为网络模拟器ENSP安装(附安装包)
    Celery笔记八之数据库操作定时任务
    Vue入门与介绍(初学必看)
    Jtti:Apache服务的反向代理及负载均衡怎么配置
    cd /op-bash: 无法为立即文档创建临时文件: 设备上没有空间
    tree-shaking
    春播秋收 “羊”鸣德州 一场“苏尼特羊”跨越千里的美丽邂逅
  • 原文地址:https://blog.csdn.net/m0_62404686/article/details/127992634