Ngắm sao

Xem dạng PDF

Gửi bài giải

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

Nguồn bài:
Vũ Phúc Hoàng
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Chíp có sở thích ngắm sao vào mỗi buổi đêm. Đêm nay, trời đặc biệt đầy sao. Chíp đếm được có ~N~ ngôi sao trên trời, Chíp ghi nhớ mỗi ngôi sao và đánh số chúng từ ~1~ đến ~N~. Mỗi ngôi sao được biểu diễn bằng một đường tròn trên mặt phẳng tọa độ, ngôi sao thứ ~i~ có tâm nằm ở tọa độ ~(A_i~, ~B_i)~ và bán kính ~R_i~. Những ngôi sao có thể đè lên nhau.

Chíp đứng ở trên mặt đất, tức là trục hoành, và nhìn thẳng lên trời. Chíp muốn biết ngôi sao gần nhất mà mình nhìn thấy được là ngôi sao nào, để có thể chọn chỗ đứng thích hợp ngắm ngôi sao mình thích. Vì vậy, Chíp đặt ra ~Q~ câu hỏi, mỗi câu hỏi gồm một số ~X_i~, hỏi rằng nếu đứng ở vị trí ~(X_i~, ~0)~ thì ngôi sao gần nhất Chíp nhìn thấy là ngôi sao nào.

Tại vị trí ~(X_i~, ~0)~, vẽ một tia song song và cùng chiều với trục tung, đường tròn đầu tiên nó chạm vào thì ngôi sao tương ứng với đường tròn đó là ngôi sao đầu tiên Chíp nhìn thấy. Bạn hãy giúp Chíp trả lời ~Q~ câu hỏi này nhé.

Input

  • Dòng đầu tiên gồm hai số nguyên ~N~, ~Q~ ~(1 \leq N~, ~Q \leq 50000)~.
  • ~N~ dòng tiếp theo, dòng thứ ~i~ gồm ba số nguyên ~A_i~, ~B_i~, ~R_i~ mô tả ngôi sao thứ ~i~.
  • ~Q~ dòng tiếp theo, dòng thứ ~i~ gồm một số nguyên ~X_i~ mô tả truy vấn thứ ~i~.
  • ~(1 \leq A_i~, ~B_i~, ~R_i~, ~X_i \leq 10^5~, ~B_i>R_i)~.

Output

  • In ra ~Q~ dòng, mỗi dòng gồm một số nguyên là chỉ số ngôi sao gần nhất Chíp nhìn thấy nếu đứng ở ~(X_i~, ~0)~.
  • Nếu nhìn thấy được nhiều ngôi sao gần nhất thì in ra chỉ số của ngôi sao có chỉ số nhỏ nhất.
  • Nếu tại vị trí đó nhìn thẳng lên không có ngôi sao nào thì in ra ~-1~.

Sample Input

4 5
2 3 2
6 9 2
5 5 2
4 7 3
4
7
8
1
9

Sample Output

1
3
2
1
-1

Note

image


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 10, Tháng 11, 2024, 18:53 sửa 2

    Hướng làm của mình

    Chỉ cần quan tâm nửa đường tròn dưới, tách nửa đường tròn thành 2 phần, phần x giảm và phần x tăng

    Sử dụng một cây cân bằng, sweepline theo y tăng dần ta duy trì được một CTDL để tìm được các điểm giao nhau

    Từ đó có thể kiểm tra được các điểm giao nhau toạ độ nguyên để chọn chỉ số nhỏ nhất

    Độ phức tạp khá lớn, do phụ thuộc vào số lượng các điểm giao nhau

    Tuy nhiên, nhận thấy rằng: Một vùng sau khi phủ kín thì không cần quan tâm các đường tròn ở trên nó nữa

    Có thể duy trì các vùng phủ kín bằng một CTDL khác dạng như segment tree beats (sử dụng ý tưởng gắn tag để tạo điều kiện kiểm tra đoạn chặt hơn)

    Độ phức tạp: O((điểm + số điểm giao nhau) * (log n + log M))

    logn do mình sử dụng priority queue để lưu sweep line cũng như một cây cân bằng làm CTDL, logM từ cây segment tree với M = 1e5

    mình chạy thử thì số điểm giao nhau cần quan tâm khá ít nhờ việc loại bỏ sớm các vùng đã phủ bằng segment tree

    có khả năng tồn tại test để chống lại cách này, do độ phức tạp phụ thuộc vào output, tuy nhiên mình chưa nghĩ được cách sinh phù hợp