70 lines
2.1 KiB
Java
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();
|
|
}
|
|
}
|
|
|