我们用一张按起点排序的有序映射来维护所有已经被赋值过的区间,每个映射项记录该区间的终点和对应的值。在对任意区间 [l,r] 执行赋值操作之前,先在 l 和 r+1 处将可能跨越端点的原有区段一分为二,这样就能保证待修改区间恰好由若干完整的映射段组成;然后依次删除这些旧段,同时在一个哈希表中扣减相应值的元素个数,如果某个非零值的计数变为零,就将当前不同元素种类数减一。删除完毕后,再在起点 l 处插入一个新段,长度为 r−l+1,如果新值此前未出现过,就先将种类数加一,再把该区间长度加入该值的计数中。由于数组在最大索引之后默认都是零,所以我们一开始就把整个 [1, N] 区间初始化为值 0,并在计...