Hướng giải của Đếm điểm nhìn thấy từ gốc toạ độ


Nhớ rằng hướng dẫn giải này chỉ nên sử dụng khi bế tắc, và tuyệt đối không nên sao chép mã nguồn kèm theo. Hãy tôn trọng tác giả bài tập và người viết hướng dẫn giải.
Nộp mã nguồn lời giải chính thức trước khi giải bài tập đó có thể khiến bạn bị ban.

Tác giả: kienadmin

Hướng dẫn giải

Một ngôi sao \((x, y)\) nhìn thấy từ gốc nếu không có ngôi sao nào khác nằm trên cùng tia \((kx, ky)\) với \(0 < k < 1\).

Hai điểm nằm trên cùng tia với gốc khi và chỉ khi vector chỉ phương của chúng tỉ lệ với nhau. Sử dụng phân số tối giản \((dx / g, dy / g)\) với \(g = \gcd(|dx|, |dy|)\) làm định danh cho mỗi tia. Số lượng tia khác nhau chính là số ngôi sao nhìn thấy.

Có thể dùng \(\text{set}\) hoặc sắp xếp để đếm các cặp \((dx/g, dy/g)\) riêng biệt.

Độ phức tạp: \(O(n \log n)\).

Mã nguồn C++

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    set<pair<int, int>> dirs;
    for (int i = 0; i < n; ++i) {
        int x, y;
        cin >> x >> y;
        int g = __gcd(abs(x), abs(y));
        dirs.insert({x / g, y / g});
    }
    cout << dirs.size() << "\n";
    return 0;
}

Nhận xét

Không có ý kiến tại thời điểm này.