trang chủ / bài tập / drazheap

Drazil và Đống

Đề bài

Mô tả

Cho một max-heap (đống cực đại) chiều cao h được cài đặt trên mảng. Đống có các tính chất sau:

  • Đống chứa đúng 2h1 số nguyên dương phân biệt, lưu trong mảng a đánh chỉ số từ 1 đến 2h1.
  • Với mọi 1<i2h1 ta có a[i]<a[i/2] (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 g (với g<h), sao cho sau khi giảm đống chỉ còn đúng 2g1 phần tử nằm ở các chỉ số từ 1 đến 2g1. Để làm điều đó, ta thực hiện thao tác sau đúng 2h2g lần: chọn một chỉ số i đang chứa phần tử và gọi hàm f(i) định nghĩa như sau (quy ước: nếu a[i]=0 thì chỉ số i đượ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 f(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 0).

Sau khi thực hiện đủ 2h2g thao tác, 2g1 phần tử còn lại phải nằm đúng ở các chỉ số từ 1 đến 2g1 (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 2g1 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 t: số lượng test.
  • Mỗi test gồm hai dòng:
    • Dòng đầu chứa hai số nguyên hg.
    • Dòng sau chứa n=2h1 số nguyên dương phân biệt a[1],a[2],,a[n], 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 g.
  • Dòng sau là 2h2g số nguyên v1,v2,,v2h2g: ở thao tác thứ i ta gọi f(vi). Nếu có nhiều dãy đạt tổng nhỏ nhất, in ra dãy bất kỳ.

Ràng buộc

  • 1t70000
  • 1g<h20
  • 1a[i]<220, các a[i] trong một test đôi một phân biệt.
  • Tổng của n qua tất cả các test nhỏ hơn 220.

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 2322=4 phần tử. Sau các thao tác, ba chỉ số 1,2,3 còn lại với tổng nhỏ nhất là 10. Test 2: tương tự, tổng nhỏ nhất là 8. Dãy lời gọi ở đây chỉ là một trong nhiều cách hợp lệ.

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