[hdu6601]エヴリシング・トライアングルに夢中

2つの結論があります:1ソートした後、答えは3つの連続した番号でなければなりません。シーケンスはフィボナッチ数であったとしても、この時間も1E9を超えているため2以上の44の系列長が3の同じ番号を(持っていなければならないとき)、その後、木々や他のデータ構造(多くの場合、少しカード、社長ツリーの提案の議長)が45大の前に維持することができます

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  の#define N 100005
 4  の#define半ば(L + R >> 1)
 5  の#define INF 1000000000
 6  int型 V、N、M、K、X、Y、[N]、B [N]、R [N] 、F [N * 20 ]、LS [N * 20 ]、RS [N * 20 ]。
7  ボイド更新(int型 K1、INT&K2、int型の L、int型の R、int型X){
 8      K2 = ++ V。
9つの      LS [K2] =のLS [K1]。
10     RS [K2] = RS [K1]。
11      F [K2] = F [K1] + 1 12      であれば(L == R)のリターン;
13      であれば(X <= MID)更新(LS [K1]、LS [K2]、L、中、X)。
14      他の更新(RS [K1]、RS [K2]、ミッド+ 1 、R、X)。
15  }
 16  INTクエリ(INT K1、int型 K2、int型の L、INT R、INT P){
 17      であれば(L == R)戻りL。
18      であれば(F [RS [K2] - F [RS [K1]]> = P)リターンクエリ(RS [K1]、RS [K2]、ミッド+ 1 、R、P)。
19      リターンクエリ(LS [K1]、LS [K2]、L、中間、PF [RS [K2] + F [RS [K1]])。
20  }
 21  INT メイン(){
 22      ながら(scanf関数(" %d個の%のD "、&​​N、&M)=!EOF){
 23          V = 0 24          のためにint型 i = 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。
25          のためには、int型 i = 1 ; iがn = <; iは++)[I] = B [i]は、
26         ソート(B + 1、B + N + 1 )。
27          int型 K =一意(B + 1、B + N + 1)-B- 1 28          のためにint型 i = 1 ; iが<= N; iが++)[I] = LOWER_BOUND(B + 1、B + K + 1、[I]) - B。
29          のためには、int型 i = 1 ; iがn = <; I ++の)更新を(R [I- 1 ]、R [I] = ++ V、1 、K、[I])。
30          のためにint型 I = 1 ; I <= M; iが++ ){
 31              のscanfを("%D%D 、およびX&Y);
 32              int型 MA =分(Y-X + 145)、フラグ= 0 ;
 33              INT J = 1 ; J <= MA; J ++ ){
 34                  [J ] =クエリ(R [X- 1 ]、R [Y]、1 、K、J)、
 35                  であれば((J> 2)&&(B [J- 1 ] + B [J] > B [J- 2 ])){
 36                      のprintf(" %LLDする\ n "、0LL + B [J] + B [J- 1 ] + B [J- 2 ]]);
 37                     フラグ= 1 38                      ブレーク;
39                  }
 40              }
 41              場合のprintf((フラグ!)" -1の\ n " );
42          }
 43      }
 44 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/PYWBKTDA/p/11260516.html