Drazil và Đống
Đề bài
Mô tả
Cho một max-heap (đống cực đại) chiều cao được cài đặt trên mảng. Đống có các tính chất sau:
- Đống chứa đúng số nguyên dương phân biệt, lưu trong mảng đánh chỉ số từ đến .
- Với mọi ta có (mỗi nút nhỏ hơn nút cha của nó).
Ta muốn giảm chiều cao của đống xuống còn (với ), sao cho sau khi giảm đống chỉ còn đúng phần tử nằm ở các chỉ số từ đến . Để làm điều đó, ta thực hiện thao tác sau đúng lần: chọn một chỉ số đang chứa phần tử và gọi hàm định nghĩa như sau (quy ước: nếu thì chỉ số được coi là không chứa phần tử):
f(i):
nếu a[2i] = 0 và a[2i+1] = 0: # i là lá
a[i] = 0
ngược lại nếu a[2i] > a[2i+1]:
a[i] = a[2i]
f(2i)
ngược lại:
a[i] = a[2i+1]
f(2i+1)
Nói cách khác, mỗi lần gọi sẽ đi xuống theo đường con lớn hơn, dồn giá trị con lên cha, cho đến khi tới một lá và xóa lá đó (gán ).
Sau khi thực hiện đủ thao tác, phần tử còn lại phải nằm đúng ở các chỉ số từ đến (và vẫn tạo thành một max-heap hợp lệ). Hãy tìm tổng nhỏ nhất có thể của phần tử còn lại, đồng thời chỉ ra một dãy lời gọi hàm đạt được tổng đó.
Dữ liệu vào
- Dòng đầu chứa số nguyên : số lượng test.
- Mỗi test gồm hai dòng:
- Dòng đầu chứa hai số nguyên và .
- Dòng sau chứa số nguyên dương phân biệt , thỏa mãn tính chất max-heap nêu trên.
Dữ liệu ra
Với mỗi test, in ra hai dòng:
- Dòng đầu là một số nguyên: tổng nhỏ nhất có thể sau khi giảm chiều cao đống xuống còn .
- Dòng sau là số nguyên : ở thao tác thứ ta gọi . Nếu có nhiều dãy đạt tổng nhỏ nhất, in ra dãy bất kỳ.
Ràng buộc
- , các trong một test đôi một phân biệt.
- Tổng của qua tất cả các test nhỏ hơn .
Ví dụ
| Input | Output | Giải thích |
|---|---|---|
| 2 3 2 7 6 3 5 4 2 1 3 2 7 6 5 4 3 2 1 |
10 1 1 3 3 8 1 1 1 3 |
Test 1: đống cao 3 cần giảm còn cao 2, phải xóa phần tử. Sau các thao tác, ba chỉ số còn lại với tổng nhỏ nhất là . Test 2: tương tự, tổng nhỏ nhất là . Dãy lời gọi ở đây chỉ là một trong nhiều cách hợp lệ. |
Bình luận