首页 > 其他分享 >刷好题,固基础-6

刷好题,固基础-6

时间:2024-04-01 18:01:41浏览次数:19  
标签:PeekMedian 树状 int 基础 好题 Pop Push cout

L3-002 特殊堆栈

堆栈是一种经典的后进先出的线性结构,相关的操作主要有“入栈”(在堆栈顶插入一个元素)和“出栈”(将栈顶元素返回并从堆栈中删除)。本题要求你实现另一个附加的操作:“取中值”——即返回所有堆栈中元素键值的中值。给定 N 个元素,如果 N 是偶数,则中值定义为第 N/2 小元;若是奇数,则为第 (N+1)/2 小元。

输入格式:

输入的第一行是正整数 N(≤105)。随后 N 行,每行给出一句指令,为以下 3 种之一:

Push key
Pop
PeekMedian

其中 key 是不超过 105 的正整数;Push 表示“入栈”;Pop 表示“出栈”;PeekMedian 表示“取中值”。

输出格式:

对每个 Push 操作,将 key 插入堆栈,无需输出;对每个 Pop 或 PeekMedian 操作,在一行中输出相应的返回值。若操作非法,则对应输出 Invalid

输入样例:

17
Pop
PeekMedian
Push 3
PeekMedian
Push 2
PeekMedian
Push 1
PeekMedian
Pop
Pop
Push 5
Push 4
PeekMedian
Pop
Pop
Pop
Pop

输出样例:

Invalid
Invalid
3
2
2
1
2
4
4
5
3
Invalid

暴力:17分

#include<bits/stdc++.h>
using namespace std;
vector<int> v;
int n;
int main(){
    cin >> n;
    for(int i = 0; i < n; ++i){
        string s;    cin >> s;
        if(s[1] == 'o'){
            if(v.size() == 0){
                cout << "Invalid\n";
            } else {
                cout << v[v.size()-1] << endl;
                v.pop_back();
            }
        } else if(s[1] == 'u'){
            int tmp;    cin >> tmp;
            v.push_back(tmp);
        } else {
            if(v.size() == 0){
                cout << "Invalid\n";
            } else if(v.size() % 2 == 0){
                vector<int> x = v;
                sort(x.begin(), x.end());
                cout << x[v.size() / 2 -1] << endl;
            } else {
                vector<int> x = v;
                sort(x.begin(), x.end());
                cout << x[(v.size()+1) / 2 - 1] << endl;
            }
        }
    }
    return 0;
}

 使用树状数组--将push进入的数x,转化为树状数组前x位的前缀和

树状数组+二分:

#include<bits/stdc++.h>
using namespace std;

#define lowbit(i) ((i) & (-i)) // 定义 lowbit 宏,计算 i 的二进制下最低位的1对应的值。
const int maxn = 100010; // 树状数组的最大范围。

int c[maxn]; // 树状数组
stack<int> s; // STL 栈,用于模拟插入和删除操作。

// 更新函数,用于更新树状数组。
void update(int x, int v){
    for(int i = x; i < maxn; i += lowbit(i))
        c[i] += v;
}

// 查询函数,用于计算从 1 到 x 的范围内所有整数出现的总次数。
int getsum(int x){
    int sum = 0;
    for(int i = x; i >= 1; i -= lowbit(i))
        sum += c[i];
    return sum;
}

// 中位数查询函数。
void PeekMedian(){
    int l = 1, r = maxn, mid, k = (s.size() + 1) / 2; // k 是中位数的位置。
    // 开始二分搜索以找到中位数。
    while(l <= r){    
        mid = (l + r) >> 1; // 取中间位置。
        if(getsum(mid) < k) l = mid + 1; // 如果中位数的位置比中间值小,意味着中位数在数组右边,增加左界限。
        else r = mid - 1; // 否则减小右界限。
    }
    cout << l << endl; // 输出中位数。
}

int main(){
    int n, temp;
    cin >> n; // 输入操作次数。
    char str[15];
    for(int i = 0; i < n; ++i){
        cin >> str; // 输入操作类型。
        if(str[1] == 'u'){ // 'Push'操作。
            cin >> temp; // 输入要push的数。
            s.push(temp); // 入栈。
            update(temp, 1); // 更新树状数组。
        } else if(str[1] == 'o'){ // 'Pop'操作。
            if(!s.empty()){
                update(s.top(), -1); // 更新出栈元素
                cout << s.top() << endl; // 输出出栈的元素
                s.pop(); // 弹出元素。
            } else {
                cout << "Invalid\n"; // 若栈为空,则输出Invalid。
            }
        } else { // 查询中位数操作。
            if(!s.empty()){
                PeekMedian(); // 调用中位数查询函数。
            } else 
                cout << "Invalid\n"; // 栈为空时输出Invalid。
        }
    }
}

 

标签:PeekMedian,树状,int,基础,好题,Pop,Push,cout
From: https://blog.csdn.net/joker_sxj/article/details/137237988

相关文章

  • Windows编程系列:图形编程基础
    前言很早以前在github上看到的一个项目,通过hookWindowsAPI函数FillRect,对资源管理器背景进行了重绘。项目地址如下:https://github.com/Maplespe/explorerTool 我第一次见到的时候,觉得这个项目还是非常吸引我,因为从XP过后,我再也没有实现过为资源管理器添加背景图片。在XP......
  • 从基础入门到学穿C++(类和对象篇)【超详细】【一站式速通】
    类和对象C语言是一种面向过程的语言,C++和python、java一样都是一种面向对象的语言。面向对象编程(Object-OrientedProgramming,OOP)和面向过程编程(ProceduralProgramming)是两种不同的编程范式面向对象编程:强调的是将现实世界中的事物抽象成对象,并通过对象之间的交互来实现......
  • 算法基础
    1.算法的特性输入输出算法具有零个或者多个输入,同时,算法具有至少一个的输出。对于在屏幕上打印”HelloWorld”一样,你可以不需要有任何的输入,直接输出得到结果即可,而对于一个没有输出的算法,没有任何意义。确定性算法的每一步都具有确定的含义,无二义性。任何条件下,算法只......
  • 1.网络基础基础了解
    一、环境准备,软件包ensp(先装下面三个)virtualboxwinpcapwireshark二、数据通信的原理从个方面说:(1)IP地址:(2)路由技术:(3)DNS域名系统1、IP地址1)、IP的基本认识IP在TCP/IP参考模型中处于第三层1️⃣:应用层,是一些协议(如:ftp文件传输,ssh远程登录,http网络请求)2️⃣:传......
  • 测试基础和功能测试
    一、质量模型1.功能性:功能数量、功能正确实现、错误处理情况2.性能3.兼容性:浏览器兼容性:谷歌,火狐,Edge4.易用性:简洁、友好、流畅、美观5.可靠性6.安全性7.可移植性8.可维护性*.界面布局a.布局与UI原型一致b.图片与文字准确与UI原型无误二、测试流程1.需求......
  • 【学习笔记】字符串基础:后缀数组
    后置数组好难啊好难啊好难啊好难啊好难啊好难啊最后还是听了不知道从ftp里搞出来的yspm讲课视频才听懂的,但是yspm用的屏幕绘画是看不见的比较尊贵,然后开了画图本文约定字符串下标从\(1\)开始后缀数组后缀数组,即\(\text{SA(SuffixArray)}\),主要关系到两个数组:\(sa......
  • 【Python基础】判断语句
    文章目录@[toc]布尔类型示例比较运算符逻辑运算符and示例or示例not示例特殊情况下的逻辑运算符andorif判断语句格式示例else判断语句格式示例elif语句格式执行流程示例if嵌套格式示例个人主页:丷从心.系列专栏:Python基础学习指南:Python学习指南布尔......
  • 【从零开始AI绘画2】StableDiffusionWebUI的基础使用
    StableDiffusionWebUI的基础使用第一章中已经完成了SDwebui的部署已经初始化,接下来我们开始基础使用,涉及更细节高级的功能本文暂时不写文章目录StableDiffusionWebUI的基础使用界面简介一、大模型SDcheckpoint加载checkpoint下载checkpoint模型二、提示词正向提示词......
  • Python教程01-基础知识
    1.注释1.1什么是注释从小我们知道看书时,可以做一些笔记,能够把当时的灵感想法记录下来,以便在以后再次阅读时快速想起来同样,Python编程语言是由英文编写的,很多时候怕忘记这些代码的作用以及注意点等,也需要写一点“笔记”,此时这些帮助我们的信息就成为“注释”1.2注释的作用......
  • 效率工具RunFlow完全手册之基础篇
    RunFlow是我们开发的一款全新的效率工具,本文作为RunFlow操作手册和功能演示的基础篇,想了解我们有哪些新特性可以阅读我们的这篇文章,这里就不过多赘述了,我们直接开始。关键字关键字是我们的一个核心概念,一个功能通常由一个或多个关键字构成,并且所有的这些关键字您都可以自定义,如......