復興を構築問題への羅区ソリューション[P4198]

最初の問題をクリアし、建物K = H / Xの完全な回路の傾きが、問題は、すべての以前の建物よりも大きいどのように多くのK Kの建物依頼することです。

この問題ツリーカバーツリーのコースが、非常に面倒で、残留物は、ほとんどの単純なブロックだと思う......

N T個のビルディングブロックに、そのような順序では、その後可視それぞれビルディングブロックの高さは、(314267)などのビルディングブロック内の各定数メンテナンス視覚配列は、ビルディングブロックである(34 67)(異なるブロックに干渉しない注意、視覚ブロック(346の第一の配列のように)、第二のブロックは、シーケンス(578)であってもよいです)

各修飾のために、我々は、ライン上の配列を維持O(N / T)各ブロック内の目に見える暴力建物に必要

各お問い合わせは、私たちはクエリごとに、その後、(建物のK値が特定の順序ではなく、視覚的ではありません)Kの視覚的な順序で、これまでに、ブロック単位での最大値KMAX一定のメンテナンスを見てを必要としますブロックシーケンスを見つけることができる場合は、このブロックの建物の全てが表示されている場合、可視位置の最初の半分は、KMAXより大きい、存在する場合、この位置の後、このブロックでは見え建物の配列は、見ることができますそして、その答えを更新し、KMAXは、次を行うことを続けます

注:すべての後、時間がタイトなので、定数は、小さな点のように書かれた二つの点と、自分の最大の機能やより良いを書き込み、またはRPを破裂されますされ...

1の#include <cstdioを>
 2の#include <cmath>
 3  のconst  int型 MAXN = 100005、sqrn = 350 4  int型H [MAXN]、V [sqrn] [sqrn]、C [sqrn]、L [sqrn]、R [sqrn]、ベル[MAXN]、N、M、ブロック、CNT、X、Y、CH。
5  ボイドリード(INTX){
 6      X = 0、CH = GETCHAR()。
7      一方(CH> ' 9 ' || CH < ' 0 ')CH = GETCHAR()。
8      一方(CH> = ' 0 ' && CH <9 ')、X = X * 10 + CH- ' 0 '、CH = )(GETCHAR。
9  }
 10  BOOL VIS(int型のx、int型のY){
 11      リターン長い 長い)H [X] * Y <(長い 長い)H [Y] * X。
12  }
 13  INT bfind(INT *、int型の L、INT R、INT MX){
 14      であれば(MX!)戻りL。
15      もし(!VIS(MX、[R]))のリターン 0 ;
16      INT、M = 0、ANS = 0 17      一方(L <= R){
 18          、M =(L + R)>> 1 19          であれば(VIS(MX、[M]))ANS = M、R = M- 1 20           L = M + 1 21      }
 22の     リターンANS。
23  }
 24  空隙ビルド(int型X){
 25個の      C [X] = 0 ;
26      INT = LST 0 27      のために(登録INT I = 1 [X]。I <= R [X]。++ I)の場合(H [i])とする場合(LST || VIS(LST、I!))LST = V [X] [C ++の[X] = I。
28  }
 29  int型の照会(){
 30      のint TOT = 0、MX = 0 、POS。
31      のために(登録をint i = 1 ; iは= CNTを<; ++ I)もし(C [i])と{
 32台の              POS = bfind(V [i]は、1 、C [i]は、MX);;
33              であれば(POS)TOT + = C [i]は-pos + 1、MX = V [i]は[i]は[C]。
34          }
 35      リターンTOT。
36  }
37  INT メイン(){
 38      リード(N)、(m)を読み出します。
39      ブロック= SQRT(N)。
40      CNT = N / ブロック。
41      であれば(N%ブロック)++ CNT。
42      のために(登録をint i = 1 ; iは= N <; ++ I)ベル[I] =(I- 1)/ブロック+ 1 43      のためには、(レジスタをint i = 1 ; iは= CNTを<; ++ I)L [I] =(I- 1)*ブロック+ 1、R [i]は= i *がブロック。
44      R [CNT] = N。
45      (レジスタint型I = 1 ; I <= M。++ I){
 46          リード(X)、読み取り(Y)。
47          H [X] = Y。
48          ビルド(ベル[X])。
49          のprintf(" %d個の\ nを" 、クエリ());
50      }
 51      リターン 0 52 }
ごみ鶏の首のコード

 

おすすめ

転載: www.cnblogs.com/Xchu/p/11265867.html
おすすめ