P1168 中位数

hhhhhhhh神奇传送门
呐呐呐,看到题目第一眼想到的当然是暴力模拟了,但是O(n*n)的时间复杂度确实受不了
那我们该想到啥捏??
对了,二叉堆!!!虽然我也不知道为什么嘤嘤嘤
好嘛,既然想到了二叉堆,就得想想如何去实现了
中位数的话呢,就是这个数在序列中前后数字个数相同(因为个数是奇数),那么构建两个堆,一个大根堆,用于装比中位数小的,另一个小根堆用于装比中位数大的
是不是很简单啊
好的上代码::

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<queue>
 5 #include<cstring>
 6 #include<iostream>
 7 using namespace std;
 8 
 9 int n,zy;
10 priority_queue < int > z;
11 priority_queue < int,vector<int>,greater<int> > y;
12 
13 int abs(int a){//手写abs会快一点??
14     return a<0?-a:a;
15 }
16 
17 int main(){
18     scanf("%d%d",&n,&zy);
19     z.push(zy);
20     printf("%d\n",z.top());
21     for (int i=2;i<=n;i++){
22         scanf("%d",&zy);
23         if (zy>z.top()){
24             y.push(zy);
25         }
26         else{
27             z.push(zy);
28         }
29         int l=z.size()-y.size();//l用于表示两个堆中个数相差之数,若大于1,则说明不平均,进行以下判断,调换堆中元素
30         while(abs(l)>1){
31             if (z.size()>y.size()){
32                 y.push(z.top());
33                 z.pop();
34             }
35             else{
36                 z.push(y.top());
37                 y.pop();
38             }
39             l=z.size()-y.size();
40         }
41         if (i%2){
42             printf("%d\n",z.size()>y.size()?z.top():y.top());
43         }
44     }
45     return 0;
46 }

好的好的,那多的就没什么好说的了 祝大家身体健康,万事如意 我为什么要废这个话??

但是,我还是得废一句话:新人开博鼓励一下吧。。。

posted @ 2019-07-02 21:20  喵呜,颜儿ღ  阅读(112)  评论(0编辑  收藏  举报