Teek is Loading...
主题
膜拜 larsr。
先差分,设 f(x) 表示 C∈[0,x] 的方案数,原问题等价于 f(R)−f(L−1)。
有个 trick,假设确定了操作序列,那么假如 C′ 没有 max(0,C) 的限制,求 C=x 的方案数,就相当于求 最终操作中的任意时刻C=C最终′−min操作中的任意时刻C′(注意 min 出来是负数),因为就相当于在 minC′ 那里 C 变成了 0,那一部分的负数不应该进入 C,而 最终C最终′ 实则是 (∑B)−(∑A),记作 S。
现在要求 C≤x,就相当于求 −minC′≤x−S,即 max−C′≤x−S,然后 max−C′=maxi,j((∑[1,i]A)−(∑[1,j]B)),那么只需要保证转移中的每一对 {i,j} 都满足条件即可。
前缀和处理一下 A,B,设 fi,j 表示 A,B 取到 {i,j} 且合法的方案数,其中 f0,0=1,答案为 fn,n,显然若 {i−1,j} 对 {i,j} 合法则 {i−1,[1,j]} 合法,所以让 fi,j 从 fi−1,j 转移过来,最后对 fi 做个前缀和即可。
时空复杂度 O(n2)。