publicstaticvoidmain(String[] args){ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.nextLine(); int[] weight = newint[n]; for (int i = 0; i < n; i++) { weight[i] = scanner.nextInt(); }
int[] number = newint[n]; for (int i = 0; i < n; i++) { number[i] = scanner.nextInt(); }
int[] ans = newint[n]; for (int i = 0; i < n; i++) { weight[number[i] - 1] = 0; ans[i] = getMax(weight, number[i]); }
for (int i = 0; i < n; i++) { System.out.println(ans[i]); } }
privatestaticintgetMax(int[] weight, int no){ int leftTotal = 0; int rightTotal = 0; for (int i = 0; i < (no - 1); i++) { leftTotal += weight[i]; }
for (int i = no; i < weight.length; i++) { rightTotal += weight[i]; }
publicstaticvoidmain(String[] args){ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.nextLine(); int[] weight = newint[n]; for (int i = 0; i < n; i++) { weight[i] = scanner.nextInt(); }
int[] number = newint[n]; for (int i = 0; i < n; i++) { number[i] = scanner.nextInt(); }
int[] ans = newint[n]; for (int i = 0; i < n; i++) { weight[number[i] - 1] = 0; ans[i] = getMax(weight); }
for (int i = 0; i < n; i++) { System.out.println(ans[i]); } }
privatestaticintgetMax(int[] weight){ int maxSum = 0; int n = weight.length; int idx = 0; while (idx < n) { while (idx < n && weight[idx] == 0) { idx++; }
if (idx < n && weight[idx] != 0) { int sum = 0; while (idx < n && weight[idx] != 0) { sum += weight[idx]; idx++; }
publicstaticvoidmain(String[] args){ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.nextLine(); int[] weight = newint[n]; for (int i = 0; i < n; i++) { weight[i] = scanner.nextInt(); }
int[] number = newint[n]; for (int i = 0; i < n; i++) { number[i] = scanner.nextInt(); }
int[] prefixSum = newint[n + 1]; for (int i = 0; i < n; i++) { prefixSum[i + 1] = weight[i] + prefixSum[i]; }
int[] ans = newint[n];
TreeSet<Integer> boundSet = new TreeSet<>(); boundSet.add(0); boundSet.add(n + 1);
TreeMap<Integer, Integer> sumMap = new TreeMap<>();
for (int i = 0; i < n; i++) { int pos = number[i]; int left = boundSet.lower(pos); int right = boundSet.higher(pos); boundSet.add(pos);
int[][] bounds = newint[n + 1][2]; for (int i = 0; i <= n; i++) { bounds[i] = newint[]{-1, -1}; }
int[] ans = newint[n];
int maxWeight = 0; for (int i = n - 1; i >= 0; i--) { int x = Integer.parseInt(number[i]); ans[i] = maxWeight; if (i == 0) { break; } // 更新最大重量 int cur = weight[x]; int left = x; int right = x;//左边界和右边界,注意如果左右无连通区域则区间为[x,x],所以初始化为x //每次只会将左右两块区域连成一块,我们只需关心一段区间的左边界和右边界,就能通过前缀和数组查询到区间和 if (x + 1 <= n && bounds[x + 1][0] != -1) { cur += prefixSum[bounds[x + 1][1]] - prefixSum[bounds[x + 1][0] - 1]; right = bounds[x + 1][1]; //更新右边界 } if (x - 1 > 0 && bounds[x - 1][1] != -1) { cur += prefixSum[bounds[x - 1][1]] - prefixSum[bounds[x - 1][0] - 1]; left = bounds[x - 1][0]; //更新左边界 }