考え方
区間$[l, r]$を考える($1 \leq l \leq r \leq M$).$l$を固定し,$r$を良い数列になるまで動かす.このとき,$r^{\prime} \geq r$に対し,区間$[l, r^{\prime}]$に対応する数列はすべて良い数列なので,個数をカウントする.
上を$l=1,...,M$に対して実施する.
「$r$を良い数列になるまで動かす」方法を考える.
- $l=1$のとき,$r = \max_{i}(A_{i})$となるまで動かせば良い.
- $l=A_{i} + 1$に動かしたとき,$r \geq B_{i}$となるまで動かせば良い(条件を満たす$i$が複数存在しうることに注意).
- $l=\min(B_{i}) + 1$に動かしたとき,$r$をどのように動かしても.良い数列は得られない.
回答例
from collections import defaultdict N, M = map(int, input().split()) AB = [list(map(int, input().split())) for _ in range(N)] maxA = max(a for a, _ in AB) minB = min(b for _, b in AB) setA = set(a for a, _ in AB) invA = defaultdict(list) for i, (a, b) in enumerate(AB): invA[a].append(i) cnt = [0] * (M + 2) l, r = 1, maxA while l <= minB: cnt[r - l + 1] += 1 cnt[M - l + 1 + 1] -= 1 if l in setA: r = max(r, max(AB[i][1] for i in invA[l])) l += 1 for i in range(len(cnt) - 1): cnt[i + 1] += cnt[i] print(*cnt[1:M + 1])