snake
考虑 \(q=1\) ,先预处理出每个方格是否被毒蛇覆盖,若覆盖则设方格权值为 \(1\) ,否则设为 \(0\) 。然后求解 \((1,1)\) 到 \((n,n)\) 的最短路即可。用 dijkstra 复杂度则为 \(\mathcal O(n^3+n^2\log n)\)。
由于网格大小为 \(n\times n\) ,那么 \(n\) 秒以后的网格都是一样的。所以 \(q\not =1\) 只需要对 \(t=1,2...n\) 分别求求解即可,时间复杂度 \(\mathcal O(n^3+n^3\log n)\)。
而方格权值要么为 \(0\) ,要么为 \(1\) ,使用 01BFS 即可使时间复杂度降为 \(\mathcal O(n^3)\)。
array
注意到 \(a_i\leq 10\)。
枚举每类数,强制这类数在区间 \([L,R]\) 中出现次数大于一半。
假设当前枚举的数为 \(c\) 。
那么把 \(a_i=c\) 看成 \(+1\) ,\(a_i\not=c\) 看成 \(-1\),满足条件的区间等价于区间和大于 \(0\) 。
设前缀和数组为 \(b_i\) ,那么有 \(b_R>b_{L-1}\),使用归并排序,线段树或者树状数组求出这样的逆序对个数即可。
时间复杂度 \(\mathcal O((\max a_i)n\log n)\)。
fac
由于每个元素的答案是独立的,所以只需要对于每个 \(A_i\) 求解答案然后求和即可。
设 \(f(x,k)\) 表示 \(x\) 经过操作 \(k\) 次后的答案,那么有:
直接递推即可做到 \(\mathcal O(Vk\log V)\)。其中 \(V=\max a_i\)。
对于 \(A_i\) 质因数只有一种,直接递推即可。
对于 \(n=1\) 的问题,可以把所有转移建边。得到的图除去自环就是一张 DAG 。那么问题变成从 \(A_1\) 出发,走 \(k\) 步到达的点权和。
设 \(g(x,i)\) 表示没有走过自环,走 \(i\) 步到达 \(x\) 的方案数。然后把剩下 \(k-i\) 步分配到每个点走自环数量上,插板法即可。
最后发现这个函数是积性函数,即对于 \(\gcd(x,y)=1,\) 有 \(f(x,k)\times f(y,k)=f(xy,k)\)。
所以预处理所有 \(p^x\) 处的值即可。
perm
\(f(i,j,S)\) 表示确定 \(1,2,\cdots,i\) 在 \(b\) 中的位置,其中有 \(j\) 个 \(c\) 确定为 \(1\)(\(i-j\) 个为 \(2\)),\(S\) 为剩余没填数的 \(b\) 位置集合。
1、\(c=1\)$$f(i,j,S)=\sum_{k\in S,|i+1-k|\le 1}f(i+1,j+1,S-{k})$$
2、\(c=2\)$$f(i,j,S)=\sum_{k\in S,|i+1-k|\le 2}f(i+1,j,S-{k})$$
注意到 \([i+3,n]\) 一定属于 \(S\),并且 \([1,i]\) 的所有空位都是一样的,所以 \(S\) 只要记 \([i+1,i+2]\) 即可。复杂度 \(O(n^2)\)。
tree
模拟题意暴力比较两两字典序,复杂度 \(\mathcal O(qn^2)\)。
首先 \(L\) 至少是 \(P_1\) 的一个前缀。否则会有 \(L>P_1\),不满足 \(L\) 是字典序最小的条件。在 \(L\) 是 \(P_1\) 前缀的前提下,\(|L|\) 越小,则 \(L\) 字典序也越小。
当 \(a_i\) 是排列的情况下,若 \(sz_x=k\) ,则要求 \(1\sim k\) 全部在 \(sz_x\) 的子树内。这里给出一种做法:对于 \(i\in[1,n-1]\) ,设 \(a_x=i,a_y=i+1\),对 \((x,y)\) 路径上除了 \(y\) 的点执行 \(+1\) 操作。那么上述要求等价于 \(x\) 的权值等于一。树剖线段树维护子树最小值(第一关键字按权值排序,第二关键字按 \(sz\) 排序)即可。时间复杂度 \(\mathcal O(n\log^2 n)\)。
当 \(a_i\) 不是排列时,就无法用上述方法了。我们需要找到更简便的,描述前缀这个限制:定义 \(d_u\) 表示 \(u\) 当前子树和与满足条件的子树和之差。也就是说 \(d_u=\sum_{v\in sub(u)}a_v-\sum_{i=1}^{sz_u}P_{1_i}\)。
于是问题转化为需要找到 \(sz\) 最小的,且 \(d=0\) 的点。同样用树剖线段树来实现,时间复杂度 \(\mathcal O(n\log^2 n)\)