canuc80k3606·7/50

Dấu Chân Trên Các Đỉnh

Nộp bài trên LQDOJ

Bài 36 · Lowest Common Ancestor

Cho một cây gồm đỉnh, đánh số từ đến . Có cặp đỉnh ; mỗi cặp xác định đường đi đơn duy nhất giữa hai đỉnh đó.

Một đỉnh được xem là nằm trên đường đi nếu nó xuất hiện ở bất kỳ vị trí nào của đường, kể cả hai đầu mút. Với mỗi đỉnh , hãy đếm có bao nhiêu trong đường đi chứa .

Input

  • Dòng đầu chứa hai số nguyên .
  • dòng tiếp theo, mỗi dòng chứa hai số nguyên , biểu diễn một cạnh của cây.
  • dòng cuối, mỗi dòng chứa hai số nguyên , biểu diễn một đường đi cần tính. Hai đầu mút được phép trùng nhau.

Output

  • In số nguyên trên một dòng. Số thứ là số đường đi chứa đỉnh , với .

Constraints

  • .
  • ; trên mỗi cạnh.
  • cạnh tạo thành một cây.
  • Input chỉ chứa một test case.

Scoring

  • Subtask ( điểm): .
  • Subtask ( điểm): không có giới hạn bổ sung.

Example

Test 1

Input

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

Output

3 4 4 2 2 3 2

Giải thích: Đỉnh thuộc các đường và , nên có kết quả . Đường chỉ đóng góp cho riêng đỉnh .

Lời giải tóm tắt
  • Ý tưởng: Chọn đỉnh làm gốc và tạo mảng hiệu delta. Với một đường từ tới , gọi . Thực hiện
  • Ý tưởng: delta[u]++, delta[v]++;
  • Ý tưởng: delta[w]--;
  • Ý tưởng: nếu không phải gốc, delta[parent[w]]--.
  • Ý tưởng: Sau khi xử lý mọi đường, duyệt các đỉnh theo thứ tự hậu tố và cộng giá trị của mỗi con vào cha. Xét riêng một truy vấn: hai dấu cộng lan từ và lên trên; hai dấu trừ làm cho còn đúng một lần, còn mọi tổ tiên thật sự của trở về . Vì vậy chính xác các đỉnh trên đường - được cộng một lần. Tính tuyến tính cho phép cộng tất cả truy vấn cùng lúc.
  • Ý tưởng: Độ phức tạp là thời gian và bộ nhớ.