Petya và Cây BST

Đề bài

Mô tả

Cho một cây nhị phân tìm kiếm (BST) gồm n nút, trong đó mỗi nút hoặc là lá (0 con), hoặc là nút trong (đúng 2 con). Mỗi nút chứa một khóa nguyên dương phân biệt; với mỗi nút trong, mọi khóa trong cây con trái đều nhỏ hơn khóa của nút, và mọi khóa trong cây con phải đều lớn hơn khóa của nút.

Cho thêm k khóa tìm kiếm, đều phân biệt và khác với mọi khóa trong cây. Với mỗi khóa tìm kiếm q, ta thực hiện tìm kiếm BST từ gốc: nếu khóa của nút hiện tại lớn hơn q thì sang con trái, ngược lại sang con phải; lặp đến khi gặp lá. Vì q không có trong cây, đường đi luôn kết thúc tại một lá nào đó và khóa của lá đó được lấy làm kết quả.

Tuy nhiên, trong quá trình tìm kiếm này ta mắc đúng một lỗi: tại đúng một nút trong nào đó trên đường đi, ta đi nhầm hướng (đi ngược lại so với so sánh đúng); ở các nút trong còn lại ta vẫn so sánh và rẽ đúng. Trên một đường tìm có d nút trong (tính cả gốc), có đúng d phương án "mắc đúng một lỗi" như vậy, và chúng được coi là đồng xác suất.

Với mỗi khóa tìm kiếm q, hãy tính kỳ vọng giá trị khóa tại lá mà thuật toán kết thúc, tính trung bình trên tất cả d phương án mắc lỗi.

Dữ liệu vào

  • Dòng đầu chứa một số nguyên lẻ n (3n<105) — số nút của cây.
  • n dòng tiếp theo, dòng thứ i chứa hai số nguyên cách nhau bởi dấu cách: chỉ số cha của nút i và khóa của nút i. Với nút gốc, chỉ số cha được cho là 1. Các nút đánh số từ 1 đến n.
  • Dòng tiếp theo chứa một số nguyên k (1k105) — số khóa tìm kiếm.
  • k dòng tiếp theo, mỗi dòng chứa một khóa tìm kiếm.

Tất cả n+k khóa đều là số nguyên dương phân biệt, không vượt quá 109. Dữ liệu vào đảm bảo cây mô tả là một BST hợp lệ; với mỗi nút khác gốc, từ khóa của nó có thể xác định nó là con trái hay con phải của cha.

Dữ liệu ra

In ra k số thực, mỗi số trên một dòng, là kỳ vọng cần tìm cho từng khóa tìm kiếm theo thứ tự. Đáp án được chấp nhận nếu sai số tuyệt đối hoặc tương đối không quá 109.

Ví dụ

Input Output Giải thích
7
-1 8
1 4
1 12
2 2
2 6
3 10
3 14
1
1
8.0000000000 Cây có gốc khóa 8, con trái khóa 4 (với hai lá 2,6), con phải khóa 12 (với hai lá 10,14). Với q=1, có hai phương án mắc đúng một lỗi: lỗi tại gốc đưa về cây con phải rồi xuống lá 10; lỗi tại nút 4 đưa sang phải để xuống lá 6. Kỳ vọng =(10+6)/2=8.
3
-1 5
1 3
1 7
6
1
2
4
6
8
9
7.0000000000
7.0000000000
7.0000000000
3.0000000000
3.0000000000
3.0000000000
Chỉ có một nút trong (gốc khóa 5). Mỗi truy vấn có đúng một phương án mắc lỗi: đi sai hướng tại gốc. Khóa nhỏ hơn 5 → lẽ ra sang trái, mắc lỗi sang phải → lá 7. Khóa lớn hơn 5 → lẽ ra sang phải, mắc lỗi sang trái → lá 3.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0