洛谷3871 [TJOI2010]中位数 维护队列的中位数
题目描述
给定一个由N个元素组成的整数序列,现在有两种操作:
1 add a
在该序列的最后添加一个整数a,组成长度为N + 1的整数序列
2 mid 输出当前序列的中位数
中位数是指将一个序列按照从小到大排序后处在中间位置的数。(若序列长度为偶数,则指处在中间位置的两个数中较小的那个)
例1:1 2 13 14 15 16 中位数为13
例2:1 3 5 7 10 11 17 中位数为7
例3:1 1 1 2 3 中位数为1
输入输出格式
输入格式:
第一行为初始序列长度N。第二行为N个整数,表示整数序列,数字之间用空格分隔。第三行为操作数M,即要进行M次操作。下面为M行,每行输入格式如题意所述。
输出格式:
对于每个mid操作输出中位数的值
输入输出样例
6 1 2 13 14 15 16 5 add 5 add 3 mid add 20 mid
5 13
说明
对于30%的数据,1 ≤ N ≤ 10,000,0 ≤ M ≤ 1,000
对于100%的数据,1 ≤ N ≤ 100,000,0 ≤ M ≤ 10,000
序列中整数的绝对值不超过1,000,000,000,序列中的数可能有重复
每个测试点时限1秒
解法
维护中位数,两个堆
发现题解大神有拿 sort+二分查找 暴力出奇迹A题的 , 还有主席树的。
操作就是
你需要一个大根堆和一个小根堆,小根堆里面放前 N/2 个大的数,大根堆里面放后 N-N/2 大的数
这样就能保证堆顶就是 中位数
在插入的时候,把 大于 堆顶的扔到小根堆 否则扔到大根堆
当然 我们还要维护 使得两个堆大小最多差1
废话
懒得写堆当然要用priority了
小根堆写法priority_queue<int,vector<int>,greater<int> > 或者你也可以机智的把数先变成负的直接扔进priority_queue里当小根堆用
#include<bits/stdc++.h> using namespace std; int N,Q,cnt; char s[10]; priority_queue <int> q1,q2; int add() {cnt++;int x;scanf("%d",&x);if(q2.empty())q2.push(x);else if(x<q2.top())q2.push(x);else q1.push(-x);while(q2.size()>cnt-cnt/2){int tmp=-q2.top();q2.pop();q1.push(tmp); }while(q1.size()>cnt/2){int tmp=-q1.top();q1.pop();q2.push(tmp);} } int main() {scanf("%d",&N);for(int i=1;i<=N;i++)add();scanf("%d",&Q);while(Q--){scanf("%s",s);if(s[0]=='a')add();else printf("%d\n",q2.top()); } return 0; }
吐槽
我永远也不想回到教室学习电磁感应和基因突变
转载于:https://www.cnblogs.com/Elfish/p/7905853.html
洛谷3871 [TJOI2010]中位数 维护队列的中位数相关推荐
- 洛谷P3879 [TJOI2010] 阅读理解 题解
洛谷P3879 [TJOI2010] 阅读理解 题解 题目链接:P3879 [TJOI2010] 阅读理解 题意: 英语老师留了 NNN 篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节 ...
- 【洛谷 P1638】 【单调队列】 逛画展
[洛谷 P1638] [单调队列] 逛画展 题目 解题思路 先求出最前面囊括所有画的位置 然后如果左边界的画不止存在一次,左边界右移 不断扩展右边界,求取答案 代码 #include<iostr ...
- 洛谷 - P1886 滑动窗口(单调队列/线段树)
题目链接:点击查看 题目大意:给出一个由n个数构成的序列,再给出一个长度为k的窗口,这个窗口从第一个下标开始一直向后移动,每次移动一个单位,每次移动询问一次该窗口中的最大值和最小值,最后输出答案 题目 ...
- [USACO18JAN]Lifeguards P 洛谷黑题,单调队列优化DP
传送门:戳我 这道题有两个版本,S和P,S是K等于1的情况,显然可以用线段树水过. P版本就难了很多,洛谷黑题(NOI/NOI+/CTSC),嘿嘿. 我自己也不是很理解,照着题解写了一遍,然后悟到了一 ...
- 【洛谷】【动态规划+单调队列】P1725 琪露诺
[题目描述:] 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到河 ...
- 洛谷 - P1714 切蛋糕(单调队列+前缀和+思维)
题目链接:点击查看 题目大意:给出一个由n个数组成的序列,求长度不超过m的连续子段和中的最大值 题目分析:因为给出了一个限制条件,所以这就不能当普通的动态规划来做了,我们可以跑一遍前缀和,然后枚举每一 ...
- [ZJOI2018]历史,洛谷P4338,类LCT维护
正题 题目大意,大致就是给出一棵有根数,给出每个点access的次数,要你安排顺序,求轻重边切换最多多少次,动态加次数. 第一步其实还挺好想的,思考一下如何静态做,发现相当于对于每一个节点,就是让各个 ...
- 洛谷P3879 [TJOI2010] 阅读理解 哈希Hash解法
题目描述: 英语老师留了 N 篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. 输入格式 第一行为整数 N ,表示短文篇数, ...
- BZOJ1112: [POI2008]砖块Klo(洛谷P3466)
平衡树 BZOJ题目传送门 洛谷题目传送门 动态维护中位数,平衡树上一发就好了. 代码: #include<cctype> #include<cstdio> #include& ...
最新文章
- 超越ImageNet?李飞飞力赞高徒的视频描述研究入选计算机视觉最前沿的十大论文
- CS本科毕业生能拿到45万年薪?
- 2016江苏计算机二级考试时间,2016年江苏计算机二级考试报名时间_无忧考网.pdf...
- IOS开发笔记3-C语言基础复习
- datalistcp.class.php,Web_PHP_DedeCMS_datalistcp.class.php 动态分页类使用案例;
- 【Quartz.net】- Cron表达式
- #pragma mark 基本使用
- testmeshpro合批_TextMesh Pro新手使用手册
- Matlab实现Faster-RCNN目标检测
- Log4j2 高危漏洞分析
- java导出word特殊符号,Word2019中输入特殊符号的方法
- JavaSE的思维导图
- 气味识别以及气味数字化存储技术
- ads1115与树莓派
- Apache NIFI
- ratel平头哥电脑感染app
- 各大网站的主题色RGB值,做icon专用
- 卖旧手机时恢复出厂设置就能不泄露数据?微信官方辟谣了!
- 网易云音乐打卡2.0(一天300首)10级指日可待
- STM32CubeIDE HAL库DMA方式驱动MPU925X(1)
热门文章
- 车险赔偿需要被保险人签字吗?
- erp系统是什么版本
- 三年级小孩近视150度需要戴近视眼镜么?
- 电商培训有用是有前置条件的
- 什么样的生意一本万利?
- Error: failed to unmarshal json. invalid character '\'' looking for beginning of value解决方案
- sql replace函数_SQL REPLACE函数概述
- azure 入门_Azure Cosmos DB中的子文档入门
- Windows Server 2016上具有Docker容器SQL Server
- sql server只读_如何在SQL Server 2016中为可用性组配置只读路由