[ことができ、スタック] Bzoj P1367シーケンス

説明

 

問題の解決策

 

コード

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 }

 

おすすめ

転載: www.cnblogs.com/Comfortable/p/11375162.html