Atcoder Beginner Content 143 D - Triangles
目次
# 問題
https://atcoder.jp/contests/abc143/tasks/abc143_d
# 解説
すべての辺の組み合わせを単純に調べるととなり間に合わない.
なので、最後の1辺の決定を高速化してに収める.
長さに制約のある問題なので、すべての辺を長さが短い順にソートしておく.
AとBを決定するとCの辺のとれる長さの範囲が決定する.
この範囲に収まる長さのCの数をカウントすれば良い.
辺はソート済みなので、二分探索を2回行い、Cを満たす最小値と最大値を探しその間の要素数をカウントする.
# 計算量
※AとBを列挙するために、Cを二分探索で探すために
# 解答
#define MAX_N 2001
Int N;
vector<Int> L(MAX_N, -1);
void input() {
cin >> N;
loop(i,0,N) cin >> L[i];
}
void solve() {
sort(span(L,0,N)); // sort edges by length asc
Int count = 0;
//O(N^2)
loop(a,0,N-2) {
loop(b,a+1,N) {
Int min_c = L[a] - L[b] + 1;
Int max_c = L[a] + L[b] - 1;
// Binary search twice. O(2LogN)
count += upper_bound(span(L,b+1,N), max_c) - lower_bound(span(L,b+1,N), min_c);
}
}
cout << count << endl;
}
int main() {
input();
solve();
return 0;
}