解法一:小根堆

堆的实现参见。通过不断找父节点打印路径。

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.ArrayList;
  5. import java.util.Arrays;
  6. import java.util.List;
  7. public class Main {
  8. public static void main(String[] args) throws IOException {
  9. BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  10. String[] input;
  11. input = reader.readLine().split(" ");
  12. final int N = Integer.parseInt(input[0]);
  13. final int M = Integer.parseInt(input[1]);
  14. input = reader.readLine().split(" ");
  15. Heap heap = new Heap();
  16. for (int i = 0; i < N; ++i) {
  17. heap.offer(Integer.parseInt(input[i]));
  18. }
  19. input = reader.readLine().split(" ");
  20. for (int i = 0; i < M; ++i) {
  21. int start = Integer.parseInt(input[i]);
  22. heap.printPath(start - 1);
  23. }
  24. }
  25. }
  26. class Heap {
  27. // 实际大小
  28. private int size;
  29. // 最大容量
  30. private int capacity;
  31. // 数据
  32. int[] data;
  33. /**
  34. * 初始化
  35. */
  36. public Heap() {
  37. size = 0;
  38. capacity = 1000;
  39. data = new int[capacity];
  40. }
  41. /**
  42. * 向上堆化
  43. *
  44. * @param i 起始位置
  45. */
  46. private void fixUp(int i) {
  47. int num = data[i];
  48. int father = (i - 1) / 2;
  49. while ((i > 0) && (data[father] > num)) {
  50. data[i] = data[father];
  51. i = father;
  52. father = (i - 1) / 2;
  53. }
  54. data[i] = num;
  55. }
  56. /**
  57. * 添加元素
  58. *
  59. * @param item 元素值
  60. */
  61. public void offer(int item) {
  62. // 扩容
  63. if (size == capacity) {
  64. data = Arrays.copyOf(data, data.length * 2);
  65. capacity *= 2;
  66. }
  67. data[size++] = item;
  68. fixUp(size - 1);
  69. }
  70. public void printPath(int start) {
  71. List<Integer> path = new ArrayList<>((int) (Math.log(size) / Math.log(2)));
  72. path.add(data[start]);
  73. while (start > 0) {
  74. start = (start - 1) / 2;
  75. path.add(data[start]);
  76. }
  77. for (int i = 0; i < path.size() - 1; ++i) {
  78. System.out.print(path.get(i) + " ");
  79. }
  80. System.out.println(path.get(path.size() - 1));
  81. }
  82. }