1057 Stack
目录
解题思路
AC代码
解题思路
虽然题目的名字是栈,但是这题和栈的关系很小,甚至我都没有用到stack这个数据结构,而是用vector<int>的pop_back()来模拟栈的弹出。
主要考察的是:在线查询,也就是查询过程中库中的元素可能因为插入删除或修改而发生改变。具体来说就是:查询序列中第K大的元素是什么。
这里用到了分块思想来降低查找的复杂度,块的大小是总元素个数开平方的向下取整,这个需要记住。
具体的思想是:先确定第K个元素在哪个块,再从块的第一个元素起遍历来找到这个元素。
两个重要的数据结构如下
int mycount[maxn+1] = {0};//count[x]表示x的数量
int block[BLOCK_NUM+1] = {0};//block[x]表示第x+1块有多少数据
易错点
加入元素的时候,上述3个数据结构都要增加,不容易忘记
mystack.push_back(x);
mycount[x]++;
block[x/BLOCK_SIZE] ++;
弹出元素的时候,往往就把后两个忘记了
mycount[mystack[mystack.size()-1]]--;//非常容易漏掉
block[(mystack[mystack.size()-1])/BLOCK_SIZE]--;
mystack.pop_back();
AC代码
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<utility>
#include<bits/stdc++.h>
using namespace std;const int INF = 1e9;//10的9次方
const double eps = 1e-3;const int maxn = 100000;
const int BLOCK_SIZE = 316;
const int BLOCK_NUM = maxn/316;vector<int> mystack; int mycount[maxn+1] = {0};//count[x]表示x的数量
int block[BLOCK_NUM+1] = {0};//block[x]表示第x+1块有多少数据 //12 sqrt(12) = 4
//BLOCK_SIZE = 4
//BLOCK_NUM = 3int main(){int n;//操作的数量char s[10];//读入的操作名称int x;//读入的元素 scanf("%d",&n);while(n--){scanf("%s",s);if(!strcmp(s,"PeekMedian")){if(mystack.size()==0){printf("Invalid\n");continue;}else{int size = mystack.size();//得到当前栈中数字的数量 int idx;//第idx大的数是我们想要的if(size%2==0)idx = size/2;else idx = (size+1)/2;int sum = 0;int out = false;//用于跳出 for(int i=0;i<=BLOCK_NUM;i++){if(out)break;sum += block[i];if(sum>=idx){int no = sum - block[i];for(int j=i*BLOCK_SIZE;j<(i+1)*BLOCK_SIZE;j++){if(out)break;if(mycount[j]>0){int temp = mycount[j];while(temp--){no ++;if(no == idx){printf("%d\n",j);out = true;break;}}}}}} }}if(!strcmp(s,"Pop")){if(mystack.size()==0){printf("Invalid\n");continue;}else{printf("%d\n",mystack[mystack.size()-1]);mycount[mystack[mystack.size()-1]]--;//非常容易漏掉block[(mystack[mystack.size()-1])/BLOCK_SIZE]--; mystack.pop_back();continue;}}if(!strcmp(s,"Push")){scanf("%d",&x);mystack.push_back(x);mycount[x]++;block[x/BLOCK_SIZE] ++; }} return 0;
}
相关文章:

【译】使用自定义ViewHelper来简化Asp.net MVC view的开发------part1
从开发者的角度来看,创建Asp.net MVC的View是一件很爽的事,因为你可以精确控制最终生成的HTML。具有讽刺意味的是不得不写出每一行HTML代码同时也是Asp.net MVC的View中让人不爽的地方。让我用我的一个经历来告诉我创建ASP.Net MVC view Helpers背后灵感…

看书挑剔,只看经典
如何选择经典,可以到网上做做功课,看看评价,综合分析一下。书籍是我们知识的主要来源。在选择书籍的时候做足功课是对我们自己时间的负责;这和在超市里买东西时对比各个品牌是一个道理;只不过奇怪的是,我很…

0-1背包使用一维dp数组时为何v要从大到小枚举
样例数据 5 8 3 5 1 2 2 4 5 2 1 3 如若不然,也就是让v按照从小到大的顺序枚举,就会出现 注意高亮的那一行,第一件物品的重量只有3,怎么会得到6呢? 代码如下 #include<cstdio> #include<cmath> #inclu…

异步编程模型--使用 IAsyncResult 对象
先推荐阅读下面的资料:MSDN:异步编程设计模式IBM developerworks: 使用异步 I/O 大大提高应用程序的性能参考博文:1、正确使用异步操作 2、Lab:体会ASP.NET异步处理请求的效果 3、WCF中的异步调用 4、WCF从理论到实践(…

对XX证券报关于物联网操作系统的几个问题的答复
XX证券报提问了几个关于物联网和物联网操作系统的问题,个人表达了一些粗陋的观点,在这里发表出来,与行业朋友交流和探讨。物联网行业最需要解决的问题是什么?虽然物联网这个行业被炒得比较热,但是截至目前,…

Java基础 - 面向对象 - 构造方法
在类中除了成员方法之外,还存在一种特殊类型的方法,那就是构造方法。构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法。 构造方法的特点: 构造方法没…

1105 Spiral Matrix 给定数组向螺旋矩阵中填入数据
两个测试用例超时,可直接跳转到 目录 超时点1 超时点2 要做的事情是,将数组按照非升序/降序,顺时针从外围到内部一圈一圈地把数据填到矩阵中,并打印出来。也就是将数组排好序后,将矩阵的坐标和数组…

一晚上就能让你小腹变小的方法 - 健康程序员,至尚生活!
仅一晚上针对小腹的锻炼就会让它明显收紧,很不可思议吧?但它确实发生了。形体教练向我们推荐:做30次转身运动(双手抱在脑后站立,迅速分别向左右两侧依次扭转上肢,注意不要以膝盖为轴,使运动轴心保持在骨盆以…

Alpha 冲刺 (2/10)
前言 队名:拖鞋旅游队组长博客:https://www.cnblogs.com/Sulumer/p/9960487.html作业博客:https://edu.cnblogs.com/campus/fzu/Grade2016SE/homework/2365组内情况 燃尽图任务分布github签入记录苏路明(组长)过去两天…

互联网对erp行业到底有什么影响
1 财务管理的影响 总账、 应收应付、资金计划,支付管理。 生产计划的影响。 重大的疑惑。 转载于:https://www.cnblogs.com/sdgxbooy/p/8892655.html

PAT甲级排队问题合集 (持续更新中)
已加入的习题 A1014,A1017 问题1和2共性 1. 都是排队问题 2. 都有一条黄线 3. 都需要找到最先离开人的队伍 4. 都有着服务时间段限制(迟于某个时间点来不予受理) 问题1:1014 Waiting in Line 问题链接:1014 Waiting in Line 这一题,…

第三章:创建用户界面组件--可视化组件(一)
1.可视化组件 1.1关于可视化组件 可视化组件的特征包括:size(大小)、事件、样式、皮肤、行为。 行为:当组件被触发时,视觉,音乐效果的变化。 1.1 .1Spark and Halo 组件 Spark是flex 4中新加的组件。halo仍旧继承了以…

Rust 1.30带来更多元编程支持,并改进了模块系统
Rust的最新版本1.30扩展了过程宏,允许它们定义新的属性和类似于函数的宏。此外,它简化了Rust模块系统,使其更加一致、直观。 Rust 1.30引入了两种新类型的过程宏,“类属性的过程宏”和“类函数的过程宏”。过程宏是Rust元编程的基…

两种最大堆建堆方式
都是用完全二叉树的静态存储方式,下标从1开始。 No.1 先按照数组的次序填入完全二叉树,再从倒数第一个非叶子节点开始,一个个地看是不是要向下调整,一直下调到不能再调。 void downAdjust(int low,int high){int i low;int j …

汉字验证码和算式验证码
大家知道简单数字或者字母验证码很容易被破解,但是算式验证码或者中文汉字验证码不容易被破解, 所以建议大家在使用验证码的时候,尽量用算式验证码或者中文汉字验证码。 下面是我写的两种验证码代码,有用到的朋友可以参考下&#…

自定义Linq的Distinct
代码 1 usingSystem;2 usingSystem.Collections.Generic;3 usingSystem.ComponentModel;4 usingSystem.Data;5 usingSystem.Drawing;6 usingSystem.Linq;7 usingSystem.Text;8 usingSystem.Windows.Forms;9 10 namespaceLinqTest11 {12 publicpartialclassForm1 : Form13 {14 p…

Python itertools 实现全组合
>>> import itertools >>> data itertools.product([A, B], [1, 2, 3]) >>> list(data) [(A, 1), (A, 2), (A, 3), (B, 1), (B, 2), (B, 3)] 转载于:https://www.cnblogs.com/xiecl/p/9961825.html

PAT(甲级)2021年春季考试 7-3 Structure of Max-Heap
考察:建堆,字符串的处理 建堆上,跳了坑,才发现自己之前的方法过于笨拙,详情见两种最大堆建堆方式 字符串处理上,走的弯路更大,但是也因此牢记了两个技巧 1. cin>>str可以用getline(cin…

[linux内核][linux中断]——软中断机制
点击打开链接 一,linux软中断的概念软中断(softirq)常常表示可延迟函数的所有种类,目前linux上使用的软中断个数是有限的,linux最多注册32个,目前使用了10个,在interrupt.h中定义,中…

JS中8个常见的陷阱
译者按: 漫漫编程路,总有一些坑让你泪流满面。 原文: Who said javascript was easy ? 译者: Fundebug为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。 这里我们针对JavaScript初学者给出一些…
支持支付宝(Alipay)付款的三个美国主机商
这段时间买国外主机的筒子们越来越多,而付款就是首先摆在大家眼前的一道障碍,大部分美国主机商只能通过信用卡购买,付款不方便。因为这个原因,很多人的美国主机都是从国内的公司或者个人买的,无法享受美国主机的优质服…

(C++)string 的两种输入方式和输出方式
注:头文件如下 #include<string> #include<cstdio> #include<iostream>using namespace std; 注:第一种输入方式遇到回车停止读入,第二种输入方式遇到空格停止读入。 两种读入方式也都可以用来读字符数组。 int main()…

ob_get_contents();basename;file_get_contents用法
ob_get_contents(); ob_end_clean(); ob_start()使用ob_start()把输出那同输出到缓冲区,而不是到浏览器。然后用ob_get_contents得到缓冲区的数据。 ob_start()在服务器打开一个缓冲区来保存所有的输出。所以在任何时候使用echo ,输出都将被加入缓冲区中…

零基础学汇编 --小甲鱼
来自http://www.51xue8.com/diannao/wangluobiancheng/2013-11-06/6584.html#fillback0100307b617b7b7b303232303266313839397b677b7b240000&anchortestanchor转载于:https://www.cnblogs.com/I-L-o-v-e-z-h-o-u/p/4235340.html

数据标准化_1
from sklearn.datasets import load_irisirisload_iris()#Z-score 数据标准化from sklearn.preprocessing import StandardScalerdata_standardStandardScaler().fit_transform(iris.data)# print(data_standard,data_standard)#Min-Maxfrom sklearn.preprocessing import MinM…

PAT(甲级)2021年春季考试 7-1 Arithmetic Progression of Primes
思路:用筛除法打素数表(与之相对的是枚举加逐个判断)是降低时间复杂度的第一个点,第二个点是运用上数学技巧,给定了等差数列的范围(2-MAX),给定了个数,那么最大的等差是可以求出的。循环的第一层从最大等差开始&#x…

hadoop中HBase子项目入门讲解
HBase 是Hadoop的一个子项目,HBase采用了Google BigTable的稀疏的,面向列的数据库实现方式的理论,建立在hadoop的hdfs上,一方面里用了hdfs的高可靠性和可伸缩行,另外一方面里用 了BigTable的高效数据组织形式.可以说HBase为海量数据的real-time相应提供了很好的一个开源解决方案…

C++/C union使用记一下锅
//首先,学习编程一定要记得加几个群或者加几个讨论组,因为这样你才能不断地进步还有吵架/滑稽 记一下 关于使用union结构体时遇到的一些坑 To zero-initialize an object of type T means: — if T is a scalar type (3.9), the object is set to the va…

推荐60+ Flex开发参考网站
推荐60 Flex开发参考网站 下面是一些好的Flex开发的网站或者Flex资源,如果你使用Flex开发,可以参考一下。 网上找的,可以参考参考!呵呵 新手入门参考: Adobe Flex 3 - adobe.comAdobe Flex Sample Applications - adobe.comVideo …

PAT(甲级)2020年秋季考试 7-4 Professional Ability Test
解题思路: 1.用拓扑排序判断给定的图是否是有向无环图(DAG) 在这个过程当中,对于入度为0的结点,在布尔数组中标记是初始结点 通过入队的结点个数是否等于总个数判断是不是DAG 注意:虽然有队列,但是不需要inq[]数组…