leet-code/src/main/java/study/plan/meituan/meituan002/Solution.java
2021-08-23 21:56:58 +08:00

70 lines
2.1 KiB
Java

package study.plan.meituan.meituan002;
import java.io.*;
/**
* @ClassName Solution
* @Description TODO
* @Author huangge1199
* @Date 2021/8/23 15:39
**/
class Solution {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(reader.readLine());
int[] arr = new int[n + 1];
int[] prev = new int[n + 1];
String[] w = reader.readLine().split(" ");
for (int i = 1; i <= n; i++) {
arr[i] = Integer.parseInt(w[i - 1]);
prev[i] += prev[i - 1] + arr[i];
}
int[][] d = new int[n + 1][2];
for (int i = 0; i <= n; i++) {
d[i] = new int[]{-1, -1};
}
int[] res = new int[n];
int maxW = 0;
String[] q = reader.readLine().split(" ");
for (int i = n - 1; i >= 0; i--) {
int x = Integer.parseInt(q[i]);
res[i] = maxW;
if (i == 0) break;
//更新最大重量
int cur = arr[x];
int left = x, right = x;
//每次只会将左右两块区域连成一块,我们只需关心一段区间的左边界和右边界,就能通过前缀和数组查询到区间和
if (x + 1 <= n && d[x + 1][0] != -1) {
cur += prev[d[x + 1][1]] - prev[d[x + 1][0] - 1];
right = d[x + 1][1]; //更新右边界
}
if (x - 1 > 0 && d[x - 1][1] != -1) {
cur += prev[d[x - 1][1]] - prev[d[x - 1][0] - 1];
left = d[x - 1][0]; //更新左边界
}
maxW = Math.max(maxW, cur);
//更新两端点的左右区间
d[left][0] = left;
d[left][1] = right;
d[right][0] = left;
d[right][1] = right;
}
for (int i = 0; i < n; i++) {
writer.write(res[i] + "\n");
}
writer.close();
reader.close();
}
}