Editorial for Hai đoạn không giao nhau


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Author: Yunan

Subtask 1: Ta đơn giản kiểm tra từng cặp (i,j) với 1 \le i < j \le N.

Độ phức tạp: O(N^2)

Subtask 2: Ta tiến hành đếm số lượng cặp (i,j) thỏa mãn đoạn thứ i và đoạn thứ j là hai đoạn giao nhau.

Với mỗi đoạn [a,b], tiến hành đếm số đoạn [c,d] giao với đoạn [a,b]. Dễ dàng nhận thấy rằng với |c-d| \le 5, để đoạn [c,d] giao với đoạn [a,b] thì c phải thỏa mãn a-5 \le c \le b, thêm vào đó do |a-b| \le 5 nên a-5 \le c \le a+5. Từ đó, ta có thể dễ dàng đếm được số đoạn [c,d] bằng cách xây dựng mảng count với count_{i,j} là số lượng đoạn [L,R] thỏa mãn L=iR-L=j.

Độ phức tạp: O(N)

Subtask 3: Tượng tự subtask 2, ta tiến hành đếm số lượng cặp (i,j) thỏa mãn đoạn thứ i và đoạn thứ j là hai đoạn giao nhau. Có thể tiến hành bằng kỹ thuật Sweep Line.

  • Gọi các sự kiện dưới dạng (x, \; add). Với mỗi đoạn [L,R], ta xây dựng hai sự kiện (L, \; True)(R, \; False).
  • Sắp xếp các sự kiện theo tăng dần giá trị x, nếu có cùng giá trị x, sắp xếp ưu tiên sự kiện có add=True nằm trước sự kiện có add=False.
  • Duy trì một biến cnt để đếm số đoạn, ban đầu cnt=0.
  • Duyệt qua các sự kiện. Tại sự kiện thứ i, nếu add=True thì số đoạn giao với đoạn tạo nên sự kiện icnt, sau đó tăng giá trị cnt=cnt+1, ngược lại nếu add=False thì giảm giá trị cnt=cnt-1.

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


Comments