トピックリンク
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 }