機械ACはREを提出し......
ポータル:QAQQAQ
質問の意味:彼らは見て
アイデアは:この質問はRMQで迅速に行うことを言われますが、この質問は、セグメントツリーです
ギャップと最大範囲があるかどうかをセグメント一番左、一番右の年のツリーメンテナンス期間の間隔、
この質問は、次のような状況に分け、主要な難易度の分類を検討しています。
1.AB多分、出力を決定していません
2.Aは、Bの不確実性を決定します。
AはB、おそらく最大出力にAであれば
それ以外の場合はfalseを出力
3.A不確かBが決定されます。
Bは、最大(A)BをLOWER_BOUNDされている場合、出力多分
それ以外の場合はfalseを出力
4.A OK B OK
Bは最大+ 1件のBである場合、Aの最大値は、真の出力との間のギャップなしで、Bであります
上記の条件が満たされている、多分ギャップ、出力がある場合
それ以外の場合はfalseを出力
コードの実装では、私が最初で最大値がライン上にBに等しいですが、何の判断が存在しないことを条件「よりも厳密に小さい」の前に等しいかどうかを考慮していませんでした
その後、停止しないクロスボーダーセグメントツリー独自の形而上学を防ぐために、いくつかの特別な裁判官を追加しました。。。(最近、コードの実装能力が...ああ改善されるべきです)
コード:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 N = 100005 ; int型のn; 構造体ノード { int型LY、RY、max_r、ギャップ。 }ツリー[N * 4 ]。 int型雨[N]、年[N]; ボイド push_up(ノード&FA、ノードLS、ノードRS) { fa.ly = ls.ly。 fa.ry = rs.ry。 fa.max_r = MAX(ls.max_r、rs.max_r)。 fa.Gap = 0 ; もし(ls.Gap || rs.Gap)fa.Gap = 1 。 もし(ls.ry + 1 <rs.ly)fa.Gap = 1 。 } ボイドビルド(int型のx、int型 L、INT R) { 場合(L == R) { ツリー[X] .ly = 年間[L]。 ツリー[X] .ry = 年間[L]。 ツリー[X] .max_r = 雨[L]。 [X] .Gapツリー = 0 。 返します。 } INT半ば=(L + R)>> 1 。 (Xビルド + X、L、中間の); 構築(X + X + 1、ミッド+ 1 、R)。 push_up(ツリー[x]は、木[X + X]、ツリー[X + X + 1 ])。 } ノードクエリー(int型のx、int型の L、int型の R、int型の L、INT R) { ノードRET。 もし(L <= 1 && R> = R)戻りツリー[X]。 INT半ば=(L + R)>> 1 。 もし(MID <L)戻りクエリ(X + X + 1、中間+ 1 、R、L、R)。 もし(MID> = R)戻りクエリ(X + X、L、中、L、R)。 ノードLS =クエリ(X +X、L、中、L、R)。 ノードRS =クエリ(X + X + 1、中間+ 1 、R、L、R)。 push_up(RET、LS、RS)。 リターンRET; } int型のmain() { scanf関数(" %のD "、&N) 以下のために(int型 i = 1 ; iが<= N; iが++)のscanf(" %D%D "、&年[i]は、&雨[I])。 ビルド(1、1 、N) int型 Q; scanf関数(" %のD "、&Q)。 一方、(q-- ) { INT X、Y、XX、YY、BL = 0 。 scanf関数(" %dの%のD "、&XX&YY)。 もし(YY < XX) { プット(" 偽" )。 続け; } であれば(XX == YY) { プット(" 多分" )。 続け; } 、X = LOWER_BOUND(年+ 1、年間+ N + 1、XX) - 年。 Y = LOWER_BOUND(年+1、年+ N + 1、YY) - 年。 もし(!XX =年間[X] && YY =年[Y])プット(" たぶん" ); それ以外の 場合(!XX = 年間[X]) { 場合(Yの== 1 ||のx == y)のプット(" たぶん" ); 他 { ノードn1 =クエリ(1、1 、nは、X、Y) ノードn2 =クエリ(1、1、nは、X、Y- 1 )。 // 中间降雨量必须严格小于! もし(n1.max_r ==雨[Y] && n2.max_r <雨[Y])プット(" 多分" )。 他のプット(「偽」); } } そう であれば(YY =!年[Y]) { 場合(Xの== N || X == Y- 1)プット(" 多分" )。 他 { ノードn1 =クエリ(1、1、nは、X、Y- 1 )。 ノードn2 =クエリ(1、1、N、X + 1、Y- 1 ); もし(n1.max_r ==雨[X] && n2.max_r <雨[X])プット(" 多分" )。 他のプット(「偽」); } } 他 { もし、(X + 1つの ==のY) { 場合(雨[X] <雨[Y])プット(" 偽" )。 それ以外の 場合(年間[X] + 1 ==年[Y])プット(" 真" ); 他のプット("多分" ); 続ける ; // ...ああ続ける前に書き込まれていない } // 公報決意は、セグメントツリーが境界防止 ノードN1 =クエリ(。1、1 、N-、X、Y)、 ノードN2 =クエリ(1、。1、N - 、Xが+ 1 、Y)、 ノードN3 =クエリ(1、1、N - 、Xが+ 1、Y- 1 )、 IF(n2.max_r ==レイン[Y] &&雨[Y] <=雨[X] n3.max_r && < 雨[Y]) { IF)n1.Gap(プット(" 多分"); 他のプット(「真」); } 他のプット(" 偽" ); } } 戻り 0 。 }