分享一个离散化时踩的坑,WA了好久才发现哪里错了,有几条题解提到了原因但是我一开始并没有看明白,所以来举例说明一下。

一个简单的例子就是n为5,给定线段为(1,5)(1,2)(4,4)(5,5),不难发现给定条件下,1、2、4、5这几个点都被覆盖了2次而3这个点只被覆盖了1次。如果仅仅对这四条线段的端点进行离散化,即将1、2、4、5离散化为1、2、3、4,然后去求答案,就会发现离散化后的4个点都被覆盖了2次,也就是之前只被覆盖了1次的3这个点因为没有出现在给定的m条线段的端点中从而在离散化时被忽略了。

其实上述问题出现的原因就是原本不连续的端点在离散化后连续了,从而忽略了一些重要的点。为了使原本不连续的点离散化后仍然不连续,只需要在离散化时将每条线段的左端点的前一个点也放入集合中参与离散化,这个多加的点就代表了当前线段的左端点和离它最近的右端点之间所有的点,这样就确保了原本不连续的端点之间至少有一个点隔着,问题就解决了。

input = lambda: sys.stdin.readline().rstrip("\r\n")
ii = lambda: int(input**())**
mii = lambda: map(int, input().split())
mod = 998244353

n, m = mii()
a = [[0, 0]]
ss = {0, n}
for _ in range(m):
    s, t = mii()
    ss.add(s - 1)
    ss.add(s)
    ss.add(t)
    a.append([s, t])
    
# 离散化
ss = sorted(list(ss))
n = len(ss)
idx = dict()
for i in range(n):
    idx[ss[i]] = i

f = [[0] * (n + 1) for _ in range(n + 1)]
g = [[0] * (n + 1) for _ in range(n + 1)]
g[0][0] = 1
a.sort()
for k in range(1, m + 1):
    for i in range(n + 1):
        for j in range(i, n + 1):
            f[i][j] = g[i][j]

    s, t = idx[a[k][0]], idx[a[k][1]]
    for i in range(n):
        for j in range(i, n):
            if not f[i][j]: continue
            if s <= i + 1:
                if t > i:
                    g[min(j, t)][max(j, t)] += f[i][j]
                    g[min(j, t)][max(j, t)] %= mod
                else:
                    g[i][j] += f[i][j]
                    g[i][j] %= mod
            elif s == j + 1:
                g[i][t] += f[i][j]
                g[i][t] %= mod
print(g[n - 1][n - 1] % mod)