説明
問題の解決策
- 論文(私を突きます)
コード
1の#include <cstdioを> 2の#include <iostreamの> 3の#include <アルゴリズム> 4 の#define N 1000010 5 使って 名前空間STD。 6 構造体ltreeは 7 { 8 int型CNT、L [N]、R [N]、V [N]、SZ [N]、D [N]。 9 INTのマージ(int型のx、int型のY) 10 { 11 であれば(x == 0 || Yの== 0)リターン X + Y。 12 であれば(V [X] < V [Y])スワップ(X、Y) 13 R [X] = SZ、(R [X]、y)のマージ[X] = SZ [Lの[X] + SZ [Rの[X]] + 1 。 14 であれば(D [R [X]]> D [L [xは]])スワップ(L [x]は、R [X])。 15 D [X] = D [Rの[X]] + 1 。 16 リターンX。 17 } 18 int型の上部(INT X){ 戻りV [X]。} 19 int型のサイズ(INT X){ 戻りSZ [X]。} 20 空隙ポップ(INT&X){X = マージ(L [x]は、R [X])。} 21 INT new_heap(INT X){V [++ CNT] = xと、SZ [CNT] = 1、L [CNT] = R [CNT] = D [CNT] = 0 ; リターンCNT; } 22 }ヒープ。 23 int型N、今、[N]、根[N] TOT [N]、L [N]、R [N]、。 24の 長い 長いANS; 25 のint main()の 26 { 27 のscanf(" %d個"、&N) 28 のために(int型 i = 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])、[I] - = I。 29 のために(int型 i = 1 ; iが<= N iが++ ) 30 { 31 今++、ルート[今] = heap.new_heap([i])と、TOT [今] = 1は、Lは、[今]はR [今] = = Iと、 32 一方(今> 1 && heap.top(ルート[NOW- 1 ])> heap.top(ルート[今])) 33 { 34 今- 、ルート[今] = heap.merge(ルート[今]、根[今+ 1 ])、TOT [今] + = TOT [今+ 1 ]、Rは、[今] Rが= [今+ 1 ]。 35 一方([今] heap.size(根)* 2 > TOT [今] + 1 )heap.pop(ルート[今])。 36 } 37 } 38 のために(INT I =1 ; iは<=今; I ++)のための(INT J = L [i]は、T = heap.top(ルート[i])と、J <= R [i]は、J ++)ANS + = ABS([j]を- T); 39 のprintf(" %のLLD " 、ANS)。 40 }