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: