L3-002. 堆栈【主席树 or 线段树 or 分块】
L3-002. 堆栈
大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有“入栈”(将新元素插入栈顶)和“出栈”(将栈顶元素的值返回并从堆栈中将其删除)。现请你实现一种特殊的堆栈,它多了一种操作叫“查中值”,即返回堆栈中所有元素的中值。对于N个元素,若N是偶数,则中值定义为第N/2个最小元;若N是奇数,则中值定义为第(N+1)/2个最小元。
输入格式:
输入第一行给出正整数N(<= 105)。随后N行,每行给出一个操作指令,为下列3种指令之一:
Push key
Pop
PeekMedian
其中Push表示入栈,key是不超过105的正整数;Pop表示出栈;PeekMedian表示查中值。
输出格式:
对每个入栈指令,将key入栈,并不输出任何信息。对每个出栈或查中值的指令,在一行中打印相应的返回结果。若指令非法,就打印“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
主席树和线段树网上有很多博客,但是算算时间复杂度,会发现用分块就可以水过了。
附ac代码(本人最近在改代码风格,所以排版很乱):
- 1 #include <cstdio>
- 2 #include <cstring>
- 3 #include <string>
- 4 #include <iostream>
- 5 #include <algorithm>
- 6 #include <vector>
- 7 #include <map>
- 8 #include <queue>
- 9 #include <map>
- 10 #include <cmath>
- 11 #include <set>
- 12 using namespace std;
- 13 const int maxn = 200000;
- 14 int nu[maxn];
- 15 int num[maxn];
- 16 int bk[1000];
- 17 char s[111];
- 18 int main() {
- 19 int n,top=0,x;
- 20 int block=400;
- 21 // printf("%dbb\n",block);
- 22 scanf("%d",&n);
- 23 for(int i=0;i<n;++i) {
- 24 scanf("%s",s);
- 25 if(s[1]=='u') {
- 26 scanf("%d",&x);
- 27 nu[x]++;
- 28 num[top++]=x;
- 29 bk[x/block]++;
- 30 // printf("%d bk\n",x/block);
- 31 }
- 32 else if(s[1]=='e') {
- 33 if(top==0) {
- 34 puts("Invalid");
- 35 continue;
- 36 }
- 37 int u=(top+1)/2;
- 38 // printf("%d u\n",u);
- 39 int sum=0;
- 40 int j;
- 41 for(j=0;j<=block;++j) {
- 42 sum+=bk[j];
- 43 // printf("%d sum\n",sum);
- 44 if(sum>=u) break;
- 45 }
- 46 for(int k=block-1;k>=0;--k) {
- 47 sum-=nu[j*block+k];
- 48 if(sum<u) {
- 49 printf("%d\n",j*block+k);
- 50 break;
- 51 }
- 52 }
- 53 }
- 54 else {
- 55 if(top==0) {
- 56 puts("Invalid");
- 57 continue;
- 58 }
- 59 x=num[--top];
- 60 printf("%d\n",x);
- 61 nu[x]--;
- 62 bk[x/block]--;
- 63 }
- 64 }
- 65 return 0;
- 66 }
线段树方面,这个博客写的挺简洁的:戳这里
L3-002. 堆栈【主席树 or 线段树 or 分块】的更多相关文章
- dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448
4448: [Scoi2015]情报传递 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 588 Solved: 308[Submit][Status ...
- 线段树简单入门 (含普通线段树, zkw线段树, 主席树)
线段树简单入门 递归版线段树 线段树的定义 线段树, 顾名思义, 就是每个节点表示一个区间. 线段树通常维护一些区间的值, 例如区间和. 比如, 上图 \([2, 5]\) 区间的和, 为以下区间的和 ...
- BZOJ3531-[Sdoi2014]旅行(树剖+线段树动态开点)
传送门 完了今天才知道原来线段树的动态开点和主席树是不一样的啊 我们先考虑没有宗教信仰的限制,那么就是一个很明显的树剖+线段树,路径查询最大值以及路径和 然后有了宗教信仰的限制该怎么做呢? 先考虑暴力 ...
- 树套树Day1线段树套平衡树bzoj3196
您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查 ...
- Splay(区间翻转)&树套树(Splay+线段树,90分)
study from: https://tiger0132.blog.luogu.org/slay-notes P3369 [模板]普通平衡树 #include <cstdio> #inc ...
- UVALive 7148 LRIP【树分治+线段树】
题意就是要求一棵树上的最长不下降序列,同时不下降序列的最小值与最大值不超过D. 做法是树分治+线段树,假设树根是x,y是其当前需要处理的子树,对于子树y,需要处理出两个数组MN,MX,MN[i]表示以 ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- BZOJ_2238_Mst_树剖+线段树
BZOJ_2238_Mst_树剖+线段树 Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影 ...
- BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树
BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...
- BZOJ_2157_旅游_树剖+线段树
BZOJ_2157_旅游_树剖+线段树 Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但 ...
随机推荐
- oracle 12C单实例打PSU
前提: oracle不管打什么样的补丁,readme都是很好的参考资料. Oracle每季度都会更新一个最新的PSU,现在12.1.0.2.0的最新的PSU是Patch 26925311. 由于今天白 ...
- 24V转5V芯片,高输入电压LDO线性稳压器
PW6206系列是一个高精度,高输入电压低静态电流,高速,低功耗降线性稳压器具有高纹波抑制.输入电压高达40V,负载电流为在VOUT=5V和VIN=7V时高达300mA.该设备采用BCD工艺制造.PW ...
- By default, the connection will be closed if the proxied server does not transmit any data within 60 seconds.
WebSocket proxying https://nginx.org/en/docs/http/websocket.html By default, the connection will be ...
- GC 卡顿 优化 三色标记优势
小结: 1. 三色标记的一个明显好处是能够让用户程序和 mark 并发的进行 Go GC 卡顿由秒级降到毫秒级以下:到底做了哪些优化? https://mp.weixin.qq.com/s/2BMGG ...
- I/O 复用 multiplexing data race 同步 coroutine 协程
小结: 1.A file descriptor is considered ready if it is possible to perform the corresponding I/O opera ...
- TCP连接的超时时间
无论你用任何语言或者是网络库,你都可以设置网络操作的超时时间,特别是connect.read.write的超时时间. 你可以在代码中把超时时间设置任意大小值,但是connect方法会有一点特殊. co ...
- 004_C++常见错误类型总结(一)之最后几行错误
1.介绍 经常进行代码测试和静态代码分析的同学,应该会遇到这样的一个问题,就是一个程序段的最后几行,或者一个源文件末尾会出现错误.本文,结合专业的静态代码分析软件PSV-Studio提供错误类型代码库 ...
- Flutter GetX使用---简洁的魅力!
前言 使用Bloc的时候,有一个让我至今为止十分在意的问题,无法真正的跨页面交互!在反复的查阅官方文档后,使用一个全局Bloc的方式,实现了"伪"跨页面交互,详细可查看:flutt ...
- Dockerfile,Dockerfile 参考文档
Dockerfile,Dockerfile 参考文档 1.Dockerfile 1.1Usage 1.2Format 1.3Parser directives 1.4escape 1.5Environ ...
- Django(简介)
Django django对大家来说肯定不陌生啦,下面就简单的介绍一下,基础的使用以及django的特点吧 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多 ...