質問の意味:
所定数N、q回の問合せ、現在の最大値と最小値との間の問い合わせ間隔の差
ソリューション:
セグメントツリーのテンプレートのタイトル
範囲は最大値、最小値を照会します
コード:
#include <iostreamの> する#include <stdio.hに> する#include <math.h>の 書式#include <アルゴリズム> の#include <ベクトル> の#include <地図> 使用して 名前空間STD。 typedefの長い 長いLL。 const int型 MAXN = 1E5 + 5 。 構造体ノード { int型のL、R。 int型ミネソタ州、MAXX。 }ツリー[MAXN << 2 ]。 int型のn、[MAXN]、Q。 ボイド push_up(INT X) { ツリー[X] .maxx = MAX(ツリー[X <<1 ] .maxx、ツリー[X << 1 | 1 ] .maxx)。 ツリー[X] .minn =分(ツリー[X << 1 ] .minn、ツリー[X << 1 | 1 ] .minn)。 } ボイドビルド(int型のx、int型の L、INT R) { ツリー[X] .L = L、木[X] .R = R。 もし(L == R) { ツリー[X] .maxx =ツリー[X] .minn = A [L]。 } 他 { int型ミッド=(L + R)>> 1 。 ビルド(X << 1 、L、MID)。 ビルド(X<< 1 | 1、中間+ 1 、R)。 push_up(X)。 } } LLクエリ(int型のx、int型の L、int型の R、int型のフラグ) { int型 L =ツリー[X] .L、R = ツリー[X] .R。 もし(L <= L && R <= R) { 場合(フラグ)戻りツリー[X] .maxx。 他の リターンツリー[X] .minn。 } 他 { 場合(フラグ) { LL ANS = 0int型; 半ば=(L + R)>> 1 。 もし(MID> = 1)ANS = MAX(ANS、クエリ(X << 1 、L、R、フラグ))。 もし(MID <R)ANS = MAX(ANS、クエリ(X << 1 | 1 、L、R、フラグ))。 push_up(X)。 戻るANSを。 } 他 { LL ANS = 0x3f3f3f3f 。 INT半ば=(L + R)>> 1 。 もし(MID> = 1)ANS =分(ANS、クエリ(X << 1 、L、R、フラグ))。 もし(MID <R)ANS =分(ANS、クエリ(X << 1 | 1、L、R、フラグ))。 push_up(X)。 戻るANSを。 } } } int型のmain() { scanf関数(" %D%dの"、&N、&Q)。 以下のために(int型私= 1 ; iが<= N; iが++ ) のscanf(" %dの"、および[I])。 ビルド(1、1 、N) 以下のために(int型 I = 1 ; I <= Q; iは++ ) { int型のL、R。 scanf関数(" %dの%のD "、&L、&R); LL ANS =クエリ(1、L、R、1)-query(1、L、R、0 ); printf(" %LLDする\ n " 、ANS)。 } 戻り 0 。 }