备战蓝桥杯---数据结构与STL应用(入门3)

我们先来一道题作为过渡:

我们只需枚举n,选出左右第一个小于它高度的坐标即可,于是我们可以用两个方向的优先队列来维护,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
struct node{
    int index,tall;
}a[100010];
int b[100010],b1[100010];
signed main(){
    cin>>n;
    while(n!=0){
        for(int i=1;i<=n;i++){
            cin>>a[i].tall;
            a[i].index=i;
        }
        deque<node> q1;
        deque<node> q2;
        for(int i=1;i<=n;i++){
            while(!q1.empty()&&a[i].tall<q1.back().tall){
                q1.pop_back();}
            int f=0;
            if(!q1.empty()) {if(a[i].tall==q1.back().tall){
                f=1;
            }}
            if(q1.empty()) b[i]=0;
            else{
                if(f==0) b[i]=q1.back().index; 
                else b[i]=b[q1.back().index];
            }   
            q1.push_back(a[i]);
        }
        for(int i=n;i>=1;i--){
            while(!q2.empty()&&a[i].tall<q2.front().tall){
                q2.pop_front();}
            int f=0;
            if(!q2.empty()){if(a[i].tall==q2.back().tall){
                f=1;
            }}
            if(q2.empty()) b1[i]=n+1;
            else{
                if(f==0) b1[i]=q2.front().index;
                else b1[i]=b1[q2.back().index];
            }
            q2.push_front(a[i]);
        }
        long long max1=0;
        for(int i=1;i<=n;i++){
            max1=max(max1,a[i].tall*(b1[i]-b[i]-1));
        }
        cout<<max1<<endl;
        cin>>n;
    }
}

这里注意一下:

当两个高度相等时,我们要特殊处理一下,一方面,我们把它们正常添加以保证后面元素不出错。另一方面,他们的值应该定位到第一个出现该高度的值。

接下来,我们主要围绕优先队列来讲:

下面是分析:

其实这是一个典型的对顶堆,下面是图解:

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int p,m,xu,jj;
int main(){
    cin>>p;
    while(p--){
    priority_queue<int> q1;
    priority_queue<int,vector<int>,greater<int> > q2;
    cin>>xu>>m;
    cout<<xu<<" "<<(m+1)/2<<endl;
    int kk=0;
    for(int i=1;i<=m;i++){
        scanf("%d",&jj);
       if(q1.empty()&&q2.empty()) q1.push(jj);
       else if(q1.empty()||q2.empty()){
           if(q1.empty()){
               if(jj>=q2.top()) q2.push(jj);
               else q1.push(jj);
           }
           else{
               if(jj<=q1.top()) q1.push(jj);
               else q2.push(jj);
           }
       }
        else{
             if(jj>=q2.top()) q2.push(jj);
               else q1.push(jj);
        }
        if(q1.size()>q2.size()+1){
            q2.push(q1.top());
            q1.pop();
        }
        if(q2.size()>q1.size()+1){
            q1.push(q2.top());
            q2.pop();
        }
        if(i%2==1){
            if(kk==10) {cout<<endl;
                        kk=0;}
            if(q1.size()>q2.size()) printf("%d ",q1.top());
            else printf("%d ",q2.top());
            kk++;
        }
    }
    if(p!=0) cout<<endl;
    }
}

接下来来个十分好的问题:

下面为分析:

首先,我们容易想到用贪心,那怎么贪心呢?

其实,我们把每个元素在剩余序列上第一个位置最远的元素替换即可,这样子,我们保证它们会相比其他决策最先遇到与自己一样的值,也保证剩余序列上与缓存上的一样的值相比其他决策最靠前,因此正确性显然。

那我们如何维护呢?先用map把数据离散化,在维护一个next数组,序列上第一个位置最远的元素用优先队列维护即可。

注意,当i遇到重复的j直接加进即可,在j没离开时,i肯定不会在栈顶。j离开后,因为next[i]=j,后加的元素肯定》j,于是i就被一直忽略。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[100010],tot,next1[100010],cun[100010],cnt,sum;
map<int,int> mp;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=n;i>=1;i--){
        if(mp.count(a[i])==0) next1[i]=n+1;
        else next1[i]=mp[a[i]];
        mp[a[i]]=i;
    }
    priority_queue<int> q;
    for(int i=1;i<=n;i++){
        if(cun[i]==1){
            q.push(next1[i]);
            cun[next1[i]]=1;
        }
        else{
            if(cnt<m){
                q.push(next1[i]);
                 cun[next1[i]]=1;
                sum++;
                cnt++;
            }
            else{
                cun[q.top()]=0;
                q.pop();
                q.push(next1[i]);
                 cun[next1[i]]=1;
                sum++;
            }
        }
    }
    cout<<sum;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/360441.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ssm和微信小程序的健身房私教预约管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

Word莫名其妙开启兼容模式将其永久取消的方法

这是因为Word模板文件被意外更改了 找到Word模板文件&#xff0c;目录在C:\Users\15976\AppData\Roaming\Microsoft\Templates 15976替换成你自己的用户名&#xff0c;不确定的就先点进C/Users看一看&#xff0c; AppData是隐藏文件夹&#xff0c;显示隐藏文件夹才能看见&am…

MySQL备份和恢复(二)mysqldump

注意&#xff1a;mysqldump是完全备份 一、mysqldump备份命令 1、 备份数据库 含创建库语句 &#xff08;1&#xff09;备份指定数据库 完全备份一个或多个完整的库&#xff0c; mysqldump -uroot -p[密码] --databases 库名1 [库名2].. >/备份路径/备份文件名.sql#导出…

安泰高压放大器电路设计方案是什么

高压放大器是电子设备中常用的一种放大器类型&#xff0c;用于将低电压信号放大到高电压输出。本文将介绍高压放大器电路设计的基本原理和方案&#xff0c;涵盖关键设计考虑因素以及常用的电路拓扑结构。 一、设计考虑因素 放大倍数&#xff1a;高压放大器的设计首要考虑因素是…

【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?

目录 1 -> 结构体的声明 1.1 -> 结构的基础知识 1.2 -> 结构的声明 1.3 -> 特殊的声明 1.4 -> 结构的自引用 1.5 -> 结构体变量的定义与初始化 1.6 -> 结构体内存对齐 1.7 -> 修改默认对齐数 1.8 -> 结构体传参 2 -> 位段 2.1 -> …

山体滑坡在线安全监测预警系统(解决方案)

在近年来&#xff0c;随着全球气候变化的影响&#xff0c;山体滑坡等自然灾害频发&#xff0c;给人们的生命财产安全带来了严重威胁。为了有效预防和减少山体滑坡带来的危害&#xff0c;许多地方开始在山上安装山体滑坡在线安全监测预警系统&#xff08;解决方案&#xff09;。…

代码编写大模型

Code Llama 70B 提供与之前发布的 Code Llama 型号相同的三个版本&#xff1a; CodeLlama - 70B&#xff0c;基础代码模型&#xff1b;CodeLlama - 70B - Python&#xff0c;专门面向 Python 的 70B&#xff1b;Code Llama - 70B - Instruct 70B&#xff0c;它针对理解自然语言…

【gulp+jq+html】添加环境变量,并在js中使用(判断环境,更改api接口域名)+ 附gulpfile.js代码

参考博文&#xff1a; gulp分离环境 gulp中如何配置环境变量 gulp环境变量配置 1、安装cross-env插件 npm install cross-env -d2、package.json更改scripts "scripts": {"clean": "gulp clean","serve:test": "cross-env NODE…

503 Service Temporarily Unavailable nginx 原因和解决办法

前言 HTTP 503 Service Temporarily Unavailable 错误通常表示服务器无法处理请求&#xff0c;可能是由于服务器过载、维护或其他临时性问题导致的。在 Nginx 中&#xff0c;这种错误通常与后端服务的可用性问题相关。以下是可能的原因和解决办法&#xff1a; 正文…

UE4 CustomDepthMobile流程小记

原生UE opaque材质中获取CustomDepth/CustomStencil会报错 在其Compile中调用的函数中没有看到报错逻辑 材质节点的逻辑都没有什么问题&#xff0c;所以看一下报错 在HLSLMaterialTranslator::Translate中 修改之后 mobile流程的不透明材质可以直接获取SceneTexture::customd…

知识点积累系列(一)golang语言篇【持续更新】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 知识点积累 系列文章的第一篇&#xff0c;记录golang语言相关的知识点 1.结构体的mapstructure是什么 mapstructure:"default" mapstructure是一个Go语言的库&#xff0c;用于将一个map中的值映射到…

“量子+半导体”!罗姆半导体与量子公司Quanmatic进行应用探索

​内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨琳梦 卉可 深度好文&#xff1a;1500字丨10分钟阅读 2023年&#xff0c;日本半导体制造商Rohm&#xff08;罗姆&#xff09;与量子算法解决方案公司Quanmatic达成合作…

StarRocks -- 基础概念(数据模型及分区分桶)

1. 数据模型 StarRocks提供四种数据模型&#xff1a; Duplicate Key, Aggregate Key, Unique Key, Primary Key 1.1 Duplicate Key 适用场景&#xff1a; 分析原始数据&#xff0c;如原始日志和原始操作记录。可以使用多种方法查询数据&#xff0c;不受预聚合方法的限制。加…

【Linux】信号量

信号量 一、POSIX信号量1、信号量的原理2、信号量的概念&#xff08;1&#xff09;PV操作必须是原子操作&#xff08;2&#xff09;申请信号量失败被挂起等待 3、信号量函数4、销毁信号量5、等待信号量&#xff08;申请信号量&#xff09;6、发布信号量&#xff08;释放信号量&…

高校教学方法论简述

简述。 背景 高校教师的任务&#xff1a;教学、科研、服务、辅导等&#xff1b;高校教师通常缺乏课程与教学的专业基础&#xff1b;应用型高校的课程教学、科研不同于学术型高校&#xff1b;民办应用型高校教师如何安身立命&#xff1f;应用型高校的专业课程与教学特色 教完--…

02-opencv简单实例效果和基本介绍-上

机器视觉概述 机器视觉是人工智能正在快速发展的一个分支。简单说来,机器视觉就是用机器代替人眼来做测量和判断。机器视觉系统是通过机器视觉产品(即图像摄取装置,分CMOS和CCD两种)将被摄取目标转换成图像信号,传送给专用的图像处理系统,得到被摄目标的形态信息,根据像素…

Linux Archcraft结合内网穿透实现SSH远程连接

文章目录 1. 本地SSH连接测试2. Archcraft安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接5. 固定SSH公网地址6. SSH固定地址连接7. 结语 Archcraft是一个基于Arch Linux的Linux发行版&#xff0c;它使用最简主义的窗口管理器而不是功能齐全的桌面环境来提供图形化用户界面。…

电加热热水器上架亚马逊美国站需要的UL174报告

电加热热水器上架亚马逊美国站需要的UL174报告 家用热水器出口美国需要办理UL174测试报告。 热水器就是指通过各种物理原理&#xff0c;在一定时间内使冷水温度升高变成热水的一种装置。分为制造冷气部分和制造热水部分。其实这两个部分又是紧密地联系在一起&#xff0c;密不可…

flask+django基于python的网上美食订餐系统_3lyq1

设计旨在提高顾客就餐效率、优化餐厅管理、提高订单准确性和客户的满意度。本系统采用 Python 语言作为开发语言&#xff0c;采用Django框架及其第三方库和第三方工具来进行开发。该方案分为管理员功能模块&#xff0c;商家功能模块以及用户前后功能模块三部分。开发前期根据用…

管理的四种风格

前言 管理的四种风格,一般的领导大概就是这几种管理模式,告知,辅导,参与,授权,还有就是乱搞式(神经病模式)。 一、告知式 告知式是指组织通过正式、明确的渠道,将信息传达给员工。这种方式通常用于传递基本的规章制度、工作流程、政策文件等。告知式的作用在于确保员…