博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P3871 [TJOI2010]中位数
阅读量:5218 次
发布时间:2019-06-14

本文共 1853 字,大约阅读时间需要 6 分钟。

题目描述

给定一个由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操作输出中位数的值

输入输出样例

输入样例#1: 
61 2 13 14 15 165add 5add 3midadd 20mid
输出样例#1: 
513

说明

对于30%的数据,1 ≤ N ≤ 10,000,0 ≤ M ≤ 1,000

对于100%的数据,1 ≤ N ≤ 100,000,0 ≤ M ≤ 10,000

序列中整数的绝对值不超过1,000,000,000,序列中的数可能有重复

 

Solution:

本题有很多做法。

1、先说一种简单点的,使用“对顶堆”的在线算法。为了动态维护中位数,我们可以建立两个二叉堆,一个小根堆一个大根堆,在读入序列时,注意:将从小到大排名为1~n/2的整数放在大根堆中,将从小到大排名为n/2+1~n的整数放在小根堆中。

每次新读入一个数x后,若x比大根堆顶小,则放入大根堆,否则放入小根堆。在查询时,若某个大根堆元素个数过多(>n/2),则将多余的元素放入小根堆,那么若此时n为奇数则中位数为小根堆堆顶,否则就是大根堆堆顶,直接输出就OK了。

代码:

 

#include
#define il inline#define ll long long#define debug printf("%d%s\n",__LINE__,__FUNCTION__)using namespace std;const int N=100005;il int gi(){ int a=0;char x=getchar();bool f=0; while((x<'0'||x>'9')&&x!='-')x=getchar(); if(x=='-')x=getchar(),f=1; while(x>='0'&&x<='9')a=a*10+x-48,x=getchar(); return f?-a:a;}priority_queue
,greater
>qmin;priority_queue
qmax;int n,x,mid,a[N],m,cn1,cn2;int main(){ n=gi();m=n; for(int i=1;i<=n;i++)a[i]=gi(); sort(a+1,a+n+1); for(int i=1;i<=n/2;i++)qmax.push(a[i]),cn1++; for(int i=n/2+1;i<=n;i++)qmin.push(a[i]),cn2++; n=gi();char s[10]; while(n--){ scanf("%s",s); if(s[0]=='a'){ scanf("%d",&x); if(x
m/2){ x=qmax.top();qmax.pop();qmin.push(x);cn2++;cn1--; } if(m&1)printf("%d\n",qmin.top()); else printf("%d\n",qmax.top()); } } return 0;}

 

 

 

 

2、“链表+hash”离线做法(留坑)。

 

 

3、还有一种无脑的平衡树在线做法(留坑,自我感觉大才小用了)。

转载于:https://www.cnblogs.com/five20/p/8509376.html

你可能感兴趣的文章
Vagrant使用教程
查看>>
Web前端JQuery面试题(二)
查看>>
delphi xe---(RAD Studio 10 Seattle)安装
查看>>
SharePoint的实体生成
查看>>
js使用模板快速填充数据
查看>>
MySQL查询表结构的SQL小结
查看>>
Code::Blocks 免安装版本下载及配置
查看>>
[python]python 遍历一个list 的小例子:
查看>>
GNU make manual 翻译(六)
查看>>
《Unix网络编程 卷I》思维导图
查看>>
line-height:150%和line-height:1.5的区别
查看>>
提问的智慧
查看>>
读取XML文件 并转成Map ...
查看>>
背包dp
查看>>
Python开发简介
查看>>
泰文无宽字体
查看>>
一些有趣的笔试题
查看>>
关于windows下服务一直处于启动ing的处理办法
查看>>
基于html5 Canvas图表库 : ECharts
查看>>
编译安装Nginx //设置nginx自动开机启动
查看>>