原案:井上
解答:井上・鈴木
解説:青木
2015/03
立命館大学競技プロブラミング合宿
Day3 F
1

 長さDの整数列 x_1, x_2, …, x_Dが与えられる
 1 <= D <= 10^5
 -10^8 <= xj <= 10^8
 クエリ(li, ri, ei)にQ回答える
 1 <= Q <= 10^5
 1 <= li <= ri <= D
 0 <= ei <= 10^8
 クエリ
 ai = min(x_li, x_ri), bi = max(x_li, x_ri)
 x_j < ai – ei または bi + ei < x_j を満たすような j の個数
を返す
 li <= j <= rj
問題概要
2015/03
立命館大学競技プロブラミング合宿
Day3 F
2

2015/03
立命館大学競技プロブラミング合宿
Day3 F
3
問題概要
l r
e
e
外れ値
i
xi
3つ

 愚直に解く
2015/03
立命館大学競技プロブラミング合宿
Day3 F
4
想定誤解法
for (int i=0; i<Q; i++) {
cin >> l >> r >> e;
int L = min(x[l], x[r]) – e;
int U = max(x[l], x[r]) + e;
int res = 0;
for (int j=l; j<=r; j++)
if (x[j] < L || U < x[j])
res ++;
cout << res << endl;
}

クエリ (l, r, e)
2015/03
立命館大学競技プロブラミング合宿
Day3 F
5
l r
i
L = min(x[l], x[r]) – e;
U = max(x[l], x[r]) + e;
L
U
Lより小さい要素とUより大きい要素を数える
範囲内の全体の要素数から、L以上U以下の要
素を除くと求まる
U以下の要素数から、Lより小さい要素数を除
くとも求まる
L以上U以下の要素数
クエリ (l, r, e)
区間[a : b]中の値 v 以下の要素数
を求めるクエリ

 クエリ処理の順番は自由
 vの小さいクエリから処理
 小さい順にxiをプロット
していくようにする
 v以下の要素数を求める
ときには、v以下のxiし
か使われていない
 i番目より前の要素の数に
ついての累積和をBITで
管理
2015/03
立命館大学競技プロブラミング合宿
Day3 F
6
v以下の要素数を求めるクエリ
i
xi

井上(c++):85行
鈴木(c++):97行
2015/03
立命館大学競技プロブラミング合宿
Day3 F
7
Writer解

First Accept
on-line: snukeさん (00:29)
on-site: iidxさん(01:14)
正答率 14/27 (51.85%)
2015/03
立命館大学競技プロブラミング合宿
Day3 F
8
提出状況

F editorial