トピックリンクします。http://acm.hdu.edu.cn/showproblem.php PID = 6621?
問題の説明
A1、A2、、ANを、あなたは、いくつかのクエリに答える必要があります:あなたは、配列を持っています。
各クエリについて、あなたは区間[L、R]と二つの数pを与えられ、K.は、あなたの目標は...、AR、pとAL、AL + 1の間のK番目の最短距離を見つけることです。
|愛- P | PとAIの間の距離に等しいです。
例:
A = {31、2、5、45、4}及びL = 2、R = 5、p = 3、K = 2
| P - A2 | = 1、| P - A3 | = 2、| P - A4 | = 42、| P - A5 | = 1.
ソート距離は{1、1、2、42}です。したがって、第2の最も近い距離は1です。
各クエリについて、あなたは区間[L、R]と二つの数pを与えられ、K.は、あなたの目標は...、AR、pとAL、AL + 1の間のK番目の最短距離を見つけることです。
|愛- P | PとAIの間の距離に等しいです。
例:
A = {31、2、5、45、4}及びL = 2、R = 5、p = 3、K = 2
| P - A2 | = 1、| P - A3 | = 2、| P - A4 | = 42、| P - A5 | = 1.
ソート距離は{1、1、2、42}です。したがって、第2の最も近い距離は1です。
入力
入力の最初の行は、T(1 <= T <= 3)テストケースの数を表す整数を含んでいます。
各テストケースのために:
冘最初の行は、2つの整数nとmを含有する(1 <= N、M <= 10 ^ 5)アレイとクエリの数の大きさを示します。
2行目は、n個のスペースで区切られた整数A1、A2、...、(1 <=は<= ^ 6 10愛)を含みます。配列の各値は一意です。
次のm行の各々は、4つの整数L「R」、P「及びK」を含みます。
これらの4個の数字から、あなたが本当のクエリLを取得する必要があり、R、P、Kのような:
ここで、L = L 'のxor X、R = R' XOR X、P = P 'のxor X、K = K'のXOR X、 Xが、ちょうど前の回答と先頭にあるX = 0
(1 <= L <R <= N、1 <= p <= 10 ^ 6、1 <= K <= 169、R - L + 1> = K)。
各テストケースのために:
冘最初の行は、2つの整数nとmを含有する(1 <= N、M <= 10 ^ 5)アレイとクエリの数の大きさを示します。
2行目は、n個のスペースで区切られた整数A1、A2、...、(1 <=は<= ^ 6 10愛)を含みます。配列の各値は一意です。
次のm行の各々は、4つの整数L「R」、P「及びK」を含みます。
これらの4個の数字から、あなたが本当のクエリLを取得する必要があり、R、P、Kのような:
ここで、L = L 'のxor X、R = R' XOR X、P = P 'のxor X、K = K'のXOR X、 Xが、ちょうど前の回答と先頭にあるX = 0
(1 <= L <R <= N、1 <= p <= 10 ^ 6、1 <= K <= 169、R - L + 1> = K)。
出力
各クエリに対して...、AR、P及びAl、AL + 1との間のK番目の最短距離を含む単一の行を印刷します。
サンプル入力
1
5 2
31 2 5 45 4
1 5 1
2 5 3 2
サンプル出力
0
1
間隔を求める| [I] -p |、前半答えをK少数、クエリ区間[P-ANS、P + ANS]はkに等しい数の数よりも大きいです
書式#include <iostreamの> の#include <アルゴリズム> 使用して 名前空間はstdを、 #defineっ長い長 の#define最大1000000 の#define MAXN 100005 INT [MAXN]、B [MAXN]、T [MAXN << 5 ]、L [MAXN << 5 ]、R [MAXN << 5 ]、和[ MAXN << 5 ]、TOT。 インラインINTの更新(INTプリ、int型の L、int型の R、INT X) { int型 RT = ++ TOT。 L [RT] = L [事前]。 R [RT] = R [事前]と、 和[RT] =和[事前] + 1 。 もし(L < R) { int型ミッド= L + R >> 1 。 もし(x <= MID)L [RT] = アップデート(L [事前]、L、中、X)。 他 R [RT] =アップデート(R [事前]、ミッド+ 1 、R、X)。 } 戻りRT; } インラインint型の照会(INT U、INT V、INT QL、INT QR、INT L、INT R) { 場合(QL <= L && QR> = R)戻り和[V] - 和[U]。 int型ミッド= L + R >> {1、ANS = 0 。 もし(QL <= MID)ANS + = クエリ(L [U]、L [V]、QL、QR、L、MID)。 もし(QR> MID)ANS + =クエリ(R [U]、R [V]、QL、QR、中間+ 1 、R)。 戻るANSを。 } int型のmain() { int型のT。 cinを >> トン。 用(INT W = 1 ; W <= T; W ++ ) { int型N、M。 CIN >> N >> M。 以下のために(int型 i = 1 ; iが= <N; iは++ ) CIN >> [I]。 } T [ 0 ] =合計[ 0 ] = L [ 0 ] = R [ 0 ] = TOT = 0 。 以下のために(int型 i = 1 ; iが<= N; iは++ ) { T [i]は =更新(T [I- 1 ]、1 、マックス、[I])。 } int型の L、R、P、K、X = 0 。 以下のために(int型私= 1 ; I <= M; iは++ ) { CIN >> L >> R >> P >> K。 リットル^ = X; R ^ = X; P ^ = X; K ^ = X。 INT PL = 0、PR = マックス。 一方(PL < PR) { int型ミッド= PL + PR >> 1 。 もし(クエリ(T 1- [ 1 ]、T [R]、MAX(1、P-MID)、分(最大、P + MID)、1、最大)> = K) { X = ミッド。 PR = 半ば; } 他 PL =ミッド+ 1 。 } COUT << X << ENDL。 } } 戻り 0 。 }