因为下标越界是未定义行为,程序可以做出任何行为
by immix @ 2023-12-23 14:09:01
@[KouMoSir](/user/1019606) 有时候如果你数组开的大小只比使用的大小小一点点,就可能WA或者TLE,差很多就会RE,还要注意,可能一个数组开小了,但是按照地址的计算,用到了其他数组
by emo_male_god @ 2023-12-23 14:09:58
因为数组是申请了一块连续的内存,越界的时候访问的是未定义的内存块。然后系统会认为这是和数组一样类型的东西,把它解释成了奇奇怪怪的值,就wa了
by HxDlBbCo877 @ 2024-01-17 20:53:03
看完题解用java写了一遍PriorityQueue解法:
```java
import java.io.*;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static final int[] f = new int[200010];
static final int[] a = new int[200010];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int l = Integer.parseInt(st.nextToken());
int r = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= n + 1; i++) {
a[i] = Integer.parseInt(st.nextToken());
}
int ans = 0;
PriorityQueue<Integer> q1 = new PriorityQueue<>((A, B) -> (B - A));
PriorityQueue<Integer> q2 = new PriorityQueue<>((A, B) -> (B - A));
for (int i = 1; i <= l; i++) {
q2.add(a[i]);
}
for (int i = l; i <= n; i++) {
q1.add(f[i - l]);
if (i - r - 1 >= l) {
q2.add(f[i - r - 1]);
}
while (!q2.isEmpty() && q1.peek().equals(q2.peek())) {
q1.poll();
q2.poll();
}
f[i] = q1.peek() + a[i];
}
for (int i = n - r + 1; i <= n; i++) {
ans = Math.max(ans, f[i]);
}
System.out.println(ans);
}
}
```
然后90分。。case #1,#2 (subtask)和#5没过,难道是同样的问题?
by LLLgoyour @ 2024-01-29 08:22:51