Official
B - Gentle Pairs Editorial by tatyam
\(2\) 点 \((a, b), (c, d)\) を通る直線の傾きは \(\frac{b-d}{a-c}\) で定義されます。 ( \(N\) 個の点の \(x\) 座標は相異なるため、 \(0\) 割りの心配はありません。)
全ての点の組について直線の傾きを調べ、 \(-1\) 以上 \(1\) 以下のものの個数を数えると、 AC を得ることができます。
回答例 (C++)
#include <iostream>
#include <vector>
using namespace std;
int main(){
int N;
cin >> N;
vector<pair<int, int>> A(N);
for(auto& [x, y] : A) cin >> x >> y;
int ans = 0;
for(int i = 0; i < N; i++) for(int j = i + 1; j < N; j++){
auto [x1, y1] = A[i];
auto [x2, y2] = A[j];
if(abs(y1 - y2) <= abs(x1 - x2)) ans++;
}
cout << ans << endl;
}
回答例 (Python)
N = int(input())
A = [tuple(map(int, input().split())) for i in range(N)]
ans = 0
for i in range(N):
for j in range(i):
if abs(A[i][1] - A[j][1]) <= abs(A[i][0] - A[j][0]):
ans += 1
print(ans)
BONUS : \(O(N \log N)\) の計算量で解いてみましょう。
posted:
last update: