羅区P1168の中央値(PQ)

トピックリンク

https://www.luogu.org/problemnew/show/P1168

問題解決のためのアイデア

この質問は、中央値を求めているが、暴力はTLEますので、我々は達成するためのアルゴリズムO(nlogn)を使用します。

これは2つのスタック、スタックルートが大きい、小さいヒープルートを使用して、小さなスタックの多数のルートが常にルートスタックの数、及び2つのスタックの最大の数との差よりも小さくなります。

図(塗装自身の手、非常に美しい、私を許してください):

ヒープの2つのスタックトップが理解しやすいように、共謀これは、このようなものです。

このように、すべての答えは、ヒープのスタックトップの要素より数です。

ACコード

1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include <キュー> 
 4  使って 名前空間STDを、
5  のconst  int型 MAXN = 100005 ;
6  INT N。
7 PRIORITY_QUEUE < 整数 > Q1。
8 PRIORITY_QUEUE < 整数、ベクトル< INT >、大きな< INT >> Q2。 
9  INT メイン(){
 10      CIN >> N。
11      のためには、int型 i = 1 ; iが<= N; I ++){
 12          のint A;
13          のscanf(" %dの"、&​​A )。
14          INT S1 = q1.size()。
15          INT S2 = q2.size()。
16          であれば(S1の== 0 )q1.push(A)。
17          {
 18              INT A1 = q1.top()。
19              であれば(<= A1){
 20                  q1.push(A)。
21の                  S1 ++ ;
22              }
 23              {
 24                 q2.push(A)。
25の                  S2 ++ ;
26              }
 27          }
 28          ながら(S1-S2> 1 ){
 29              q2.push(q1.top())。
30              q1.pop()。
31              s1-- 32の              S2 ++ ;
33          }
 34          ながら(S2-S1> = 1 ){
 35              s2-- 36の              S1 ++ ;
37              q1.push(q2.top())。
38              q2.pop()。
39          }
 40          であれば(I%2 == 1)のprintf(" %d個の\ n " 、q1.top())。
41      }
 42      リターン 0 43 }

 

おすすめ

転載: www.cnblogs.com/yinyuqin/p/11241174.html