Cung tròn

Xem dạng PDF

Gửi bài giải

Điểm: 0,01 (OI)
Giới hạn thời gian: 2.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Tác giả:
Nguồn bài:
Kỳ thi chọn đội tuyển Olympic 2018
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Trong lúc ôn tập phần hình học để thi học sinh giỏi tin học, Hải quan sát mối quan hệ giữa các cung tròn được tạo bởi giao của một số các đường thẳng với một đường tròn như sau:

Cho một đường tròn xác định bởi tọa độ tâm ~(x, y)~, bán kính ~r~ và ~n~ đường cát tuyến, trong đó đường cát tuyến thứ ~i~ được xác định bởi phương trình ~a_i x + b_i y = c_i~. Biết rằng không có đường cát tuyến nào đi qua tâm đường tròn. Một đường cát tuyến nếu cắt đường tròn tại hai điểm ~A~ và ~B~ thì cung ~\widehat{AB}~ nhỏ của đường tròn được gọi là cung đặc trưng của đường cát tuyến đó. Lưu ý: nếu đường cát tuyến tiếp xúc với đường tròn thì cung đặc trưng suy biến thành một điểm.

Tiếp theo, Hải dựng đồ thị đơn vô hướng ~G = (V, E)~, trong đó mỗi đỉnh trong đồ thị tương ứng với một cung đặc trưng của đường tròn, và hai đỉnh trong ~V~ có cạnh nối trong ~E~ khi và chỉ khi hai cung đặc trưng tương ứng của hai đỉnh này có điểm chung.

Gọi hai cạnh khác nhau ~(u_1, v_1)~ và ~(u_2, v_2)~ trong ~E~ là độc lập nếu như không tồn tại đỉnh ~t \in V~ sao cho cả hai điều kiện sau đều đúng:

  • Cạnh ~(u_1, t)~ hoặc cạnh ~(v_1, t)~ nằm trong ~E~.

  • Cạnh ~(u_2, t)~ hoặc cạnh ~(v_2, t)~ nằm trong ~E~.

Hải muốn tìm ~E'~ là tập con lớn nhất của ~E~ sao cho mọi cặp cạnh trong ~E'~ đều độc lập. Hãy giúp Hải giải bài này nhé!

Input

Dòng thứ nhất chứa số nguyên dương ~T~ (~1 \le T \le 10~) là số lượng bộ dữ liệu. Mô tả của mỗi bộ dữ liệu như sau:

Dòng đầu tiên chứa ba số nguyên ~x~, ~y~, ~r~ (~|x|, |y|, r \le 10^9~) lần lượt là tọa độ tâm và bán kính của đường tròn.

Dòng thứ hai chứa một số nguyên dương ~n~ (~1 \le n \le 50\,000~) là số lượng đường cát tuyến.

Dòng thứ ~i~ trong ~n~ dòng tiếp theo chứa ba số nguyên ~a_i, b_i, c_i~ (~|a_i|, |b_i|, |c_i| \le 10^9~) là các tham số của đường cát tuyến thứ ~i~.

Dữ liệu đảm bảo là trong số các giao điểm của các đường cát tuyến với đường tròn không có hai điểm nào cách nhau ở khoảng cách nhỏ hơn ~10^{-3}~.

Output

In ra ~T~ dòng, mỗi dòng chứa một số nguyên là số lượng cạnh nằm trong tập độc lập lớn nhất. Nếu không tồn tại cạnh nào, in ra ~-1~.

Scoring

Subtask Điểm Giới hạn
1 ~20~ ~n \le 10~
2 ~20~ ~n \le 50~
3 ~30~ ~n \le 500~
4 ~30~ Không có ràng buộc gì thêm

Sample Input 1

1
0 0 5
8
0 1 2
11 3 40
7 -3 29
1 -2 10
-1 -2 9
1 0 -2
-6 7 42
0 1 5

Sample Output 1

2

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 1
    vrski39  đã bình luận lúc 9, Tháng 3, 2025, 5:41

    Đánh dấu các đường cát tuyến theo thứ tự từ 0

    Theo test mẫu, ta thu được một đồ thị 8 đỉnh với các cạnh sau

    0 1
    0 5
    0 6
    0 7
    1 2
    2 3
    3 4
    4 5
    5 6
    

    Minh hoạ

    Không tồn tại cặp cạnh độc lập nào cả

    Ví dụ: Xét cặp cạnh (0, 6) và (2, 3)
    Lấy t = 1
    + Tồn tại cạnh (0, 1) thoả mãn điều kiện 1
    + Tồn tại cạnh (1, 2) thoả mãn điều kiện 2
    Vì vậy chúng không độc lập
    Tương tự với tất cả cặp cạnh khác
    

    Mong được ai đó giải thích test mẫu

    Mình có thử hiểu độc lập theo nghĩa induced matching, cái này đúng được test mẫu nhưng vào bộ dữ liệu thì sai