给定一个 $1\sim n$ 的排列 $a$,该排列的每个子序列 $s=(s_1,s_2\cdot s_p)$ 对 $k$ 的贡献为 $\sum_{i=1}^{p-1}[s_i\lt k\lt s_{i+1}]+[s_i\gt k\gt s_{i+1}]$。
对 $k=1\sim n$,问所有子序列对 $k$ 的贡献总和。
考虑所有子序列中 $(a_i,a_j)(i\lt j)$ 相邻的情况,易知共有 $2^{n-j+i+1}$ 个子序列满足条件。
于是 $(a_i,a_j)(i\lt j)$ 对 $k\in (\min(a_i,a_j),\max(a_i,a_j))$ 的贡献为 $2^{n-j+i+1}$,考虑枚举 $(i,j)$ 然后差分计算贡献,于是得到 $O(n^2)$ 暴力做法。
接下来考虑优化,不妨假设每对 $(a_i,a_j)(i\lt j)$ 对所有 $k$ 产生 $2^{n-j+i+1}$ 的正贡献,然后对 $k\in [1,\min(a_i,a_j)]\bigcup [\max(a_i,a_j),n]$ 产生负贡献。
正贡献总和不难发现为 $\sum_{i=1}^{n-1} (n-i)2^{n-i-1}$ ,接下来考虑计算负贡献总和。
考虑从 $1\sim n$ 枚举 $j$,树状数组维护 $1\le i\lt j$ 的贡献和,即 $c_{a_i}=2^ia_i(i\lt j)$。
于是 $j$ 对 $[1,a_j]$ 产生负贡献为 $2^{n-j}\sum_{i=1}^{a_j} c_i$,对 $[a_j,n]$ 产生负贡献为 $2^{n-j}\sum_{i=a_j}^{n} c_i$。
同理,再从 $n\sim 1$ 枚举 $i$ 计算负贡献。最后用正贡献总和减去负贡献总和即可得到答案,时间复杂度 $O(n\log n)$。
给定一个模 998244353 (质数)意义下的 $n\times n$ 的方阵和 $Q$ 个修改操作。每个修改操作都修改方阵中某个元素为一个新的值。在每个修改操作后,输出方阵的行列式。
数据范围:
$1\le n,Q\le 500$
(修改第 $x$ 行第 $y$ 列的元素为 $z$)$1\le x,y\le n,0\le z<998244353$。
故总时间复杂度 $O(n^3+Qn^2)$。
问有多少个 $1\sim n$ 的排列可以拆分成一个上升子序列和一个下降子序列。
如果一个排列存在多种拆分,则仅考虑上升序列最长的拆分。
如果存在多个最长的上升子序列,则考虑所有最长上升子序列 $(a_1,a_2\cdots a_m)$ 中 $a_m$ 最大的子序列,如果还有相同的则依次比较 $a_{m-1},a_{m-2}\cdots$
易知,这样任意一个满足条件的排列与拆分一一对应。
设 $\text{dp}(i,j,k,t)$ 表示 $1\sim i$ 的排列满足上升子序列最后一个元素下标为 $j$ 且下降子序列的第一个元素下标为 $k$,且 $t=0/1$ 表示能否将上升序列最后一个元素加入下降序列的方案数。
如果 $k=i+1$ 则表示下降序列为空。枚举新加入 $i+1$ 的位置 $p$,设原序列为 $s[1\sim i]$,则新序列为 $s[1\sim p-1],i+1,s[p\sim i]$。
同时加入 $i+1$ 时需要维护上升序列最长且逆向字典序最大的性质。
上述转移的正确性由 $1\sim i+1$ 的排列对应的上升序列最长且逆向字典序最大的拆分一定来自唯一的 $1\sim i$ 的排列对应的上升序列最长且逆向字典序最大的拆分再加上 $i+1$ 这条性质保证,但本人不会证明。
jxm:感觉有一半的时间在 debug
wza:代码能力需要加强