起始时,让所有的牛都是最高身高。
然后在处理 m 个关系时,每次对 [l, r] 之间的牛(也就是 [l + 1, r - 1] 范围)的牛进行减一。
需要注意要对 m 个关系进行去重,以及处理那些反着大小给的关系。
详见代码
import java.util.*;
class Main {
static int[] b = new int[10009];
static void add(int l, int r, int c) {
if (l > r) return;
b[l] += c;
b[r + 1] -= c;
}
static Set<String> set = new HashSet<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), p = sc.nextInt(), h = sc.nextInt(), m = sc.nextInt();
for (int i = 1; i <= n; i++) add(i, i, h);
while (m-- > 0) {
int l = sc.nextInt(), r = sc.nextInt();
if (l > r) {
int tmp = l;
l = r;
r = tmp;
}
String key = l + "_" + r;
if (!set.contains(key)) {
set.add(key);
add(l + 1, r - 1, -1);
}
}
int[] ans = new int[n + 1];
for (int i = 1; i <= n; i++) ans[i] = ans[i - 1] + b[i];
for (int i = 1; i <= n; i++) System.out.println(ans[i]);
}
}