解法一:小根堆
堆的实现参见堆。通过不断找父节点打印路径。
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class Main {public static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String[] input;input = reader.readLine().split(" ");final int N = Integer.parseInt(input[0]);final int M = Integer.parseInt(input[1]);input = reader.readLine().split(" ");Heap heap = new Heap();for (int i = 0; i < N; ++i) {heap.offer(Integer.parseInt(input[i]));}input = reader.readLine().split(" ");for (int i = 0; i < M; ++i) {int start = Integer.parseInt(input[i]);heap.printPath(start - 1);}}}class Heap {// 实际大小private int size;// 最大容量private int capacity;// 数据int[] data;/*** 初始化*/public Heap() {size = 0;capacity = 1000;data = new int[capacity];}/*** 向上堆化** @param i 起始位置*/private void fixUp(int i) {int num = data[i];int father = (i - 1) / 2;while ((i > 0) && (data[father] > num)) {data[i] = data[father];i = father;father = (i - 1) / 2;}data[i] = num;}/*** 添加元素** @param item 元素值*/public void offer(int item) {// 扩容if (size == capacity) {data = Arrays.copyOf(data, data.length * 2);capacity *= 2;}data[size++] = item;fixUp(size - 1);}public void printPath(int start) {List<Integer> path = new ArrayList<>((int) (Math.log(size) / Math.log(2)));path.add(data[start]);while (start > 0) {start = (start - 1) / 2;path.add(data[start]);}for (int i = 0; i < path.size() - 1; ++i) {System.out.print(path.get(i) + " ");}System.out.println(path.get(path.size() - 1));}}
