2025.2.10 做题记录

模拟赛

specie

P11815

性质 \(1\):同种生物会在同个格子里。因为 \(\binom{x+k}{2}+\binom{y-k}{2}\ge \binom{x}{2}+\binom{y}{2}\),在 \(x \ge y\) 时。

性质 \(2\):最后有生物的格子不会超过 \(3\) 个,且有 \(2\) 个一定选到 \(4\) 个角上。考虑 \((x,y)\) 有生物,且 \(1 < x < X \land 1 <y<Y\)。若 \((x,y)\) 左上角有点中有生物,那么将那个点替换为 \((1,1)\) 不劣,因为不包含那个点的生物一定包含 \((x,y)\),此时一定不包含 \((1,1)\)。而如果包含那个点的生物不包含 \((x,y)\),此时那个生物选择 \((x,y)\) 不劣。其余情况同理。若同时有 \(3\) 个角上有生物,且 \((x,y)\) 上也有生物。不妨设左下角有生物,那么这个点上的生物一定能放在其余两个点中的一个。因为不存在矩形恰好包含网格的 \(3\) 个边缘角。

然后就可以做了。考虑枚举 \(2\) 个角是具体哪个。然后二维差分维护出对于每个点 \((x,y)\),包含它的矩形和。此时每个点最多有 \(3\) 种取法,枚举优先级即可。时间复杂度 \(O(XY+n)\)

swap

性质 \(1\):交换次数一定为 \(n\) 减去置换环数量。这个显然,因为对于一个置换环在最坏情况下也是可以去掉一条边然后传递交换的。

性质 \(2\):答案下界为 \(C \times (n-cnt) +\frac{1}{2}\sum |p_i-i|\)。这个分开计算贡献可以得到。

那么考虑构造下界。那么如果要交换位置 \(x,y\),在保证下界的情况下,应该满足 \(y\ge p_x \ge p_y \ge x\)。此时代价为 \(|p_x-p_y| + C\)。那么我们每次对于一个没有匹配上的 \(x\),找到最近的这样一个 \(y\),且 \(x,y\) 在同一个置换环中,显然一定会存在这样的 \((x,y)\)。那么就可以构造到这个下界,因为 \(|p_x-p_y|\) 这部分是能取到的,\(C \times (n-cnt)\) 这部分每次交换不会使置换环合并,也是可以的。

具体地,我们找到当前最大的没有匹配的点,然后向两边拓展直到找到某个可以匹配且符合下界的点。这样我们会将一个置换环拆成两个新的置换环,那么总复杂度是 \(O(n\log n)\) 的。

sort

考虑如何快速判断两个字符串大小。

有个简单的方式是直接上哈希,二分找到第一个不同的位置就可以了。因为修改是连续区间所以可以差分到单点,那么用主席树维护每个字符串的哈希值。则单次查询两个字符串大小时间复杂度 \(O(\log m)\)。外面加个 sort 就是 \(O(n\log n\log m+n\log m)\) 的。

其它

[NOSOI R1] Square Sequence

因为 \((x-y)^2=x^2 -2xy + y^2\),所以可以先把 \(x^2,y^2\) 加到答案里。

那么问题变成,划分成两个子序列,\(f(x)=2\sum x_i x_{i-1} + {x_1}^2 + {x_k}^2\),求 \(f(A)+f(B)\) 最大值。

定义状态函数 \(f_{i,j}\) 表示前 \(i\) 个数,某一个序列末尾为 \(i\),另一位为 \(j\) 的最大权值和。那么:

  1. \(i\)\(i-1\) 在一起。\(f_{i,j}=f_{i-1,j}+2x_ix_{i-1}\)
  2. \(i\)\(i-1\) 不在一起。\(f_{i,i-1}=\max(f_{i-1,j}+2x_j x_i)\)

发现第一个是常量,第二个是一个李超线段树。由于之前加入的线段显然没有之后的优,所以不需要删除线段。时间复杂度 \(O(n\log V)\)

[NOSOI R1] Free Pairs

\(x = {a_1}^{p_1} {a_2}^{p_2}\dots\)\(y = {a_1}^{q_1}{a_2}^{q_2}\dots\)

那么只要 \(\min(p_i,q_i)\le 1\) 就是自由的。枚举 \(k^2\),那么只要 \((k^2) |\gcd(a_i,a_j)\)\((i,j)\) 就是假的。此时秩序满足 \((k^2)|a_i,(k^2)|a_j\),然后容斥。

问题变成查询 \(x\) 倍数的数量。对每个数枚举约数,那么变成查询 \(x\) 的数量。此时 \(x\)\(10^2\) 种,但是一个数包含约数 \(k^2\) 的数量只有最多 \(11\) 个。那么上分块,复杂度为 \(O(\alpha n \frac{n}{B} + \beta n B),\alpha = 11,\beta = 100\) 的。显然不对。

但是当我们只枚举满足 \(p_i \le 3\)\(x\) 时,\(\beta\) 就变成 \(61\) 了,然后就能过了。

[NOSOI R1] Terrorists

我可以知道哪两个人可以相邻。此时 \(f_{i,j}=\sum f_{i-1,k}[c_{j,k}=1]\)。那么矩阵快速幂优化做到 \(O(m^3\log n)\)

P9823 [ICPC 2020 Shanghai R] The Journey of Geor Autumn

考虑最小值放哪里。记 \(pos\)\(1\) 的位置,那么 \(pos \in [1,k]\)。此时 \([pos+1,pos+k]\) 都是合法的。对于 \([pos+k+1,n]\) 这个序列,问题和 \([1,n]\) 是一致的,需要让序列 \([pos+1,n]\) 满足条件。定义状态函数 \(f_n\) 表示 \(n\) 个数的排列的方案数。

那么有:\(f_{n}=\sum\limits_{pos = 1}^{k}f_{n-pos}\times (pos-1)!\times \binom{n-1}{pos-1}\)。这里在 \(n \le k\) 时有 \(f_{n}=n!\)。表示我们将 \([1,pos]\)\([pos+1,n]\) 融合。由于它们两个都是排列,所以可以看做相对大小关系将一个插入另一个(互不影响),且 \([1,pos]\) 这个排列只需要满足 \(p_{pos}=1\)

化简一下转移,有:\(f_{n}=\sum\limits_{pos=1}^{k}f_{n-pos}\times \frac{(n-1)!}{(n-pos)!}\)。那么只需要维护 \(\sum\limits_{pos=1}^{k}\frac{f_{n-pos}}{(n-pos)!}=\sum\limits_{i=n-k}^{n-1}\frac{f_i}{i!}\) 了。前缀和优化可以做到 \(O(n)\)。瓶颈在于求逆元。

CF1657E Star MST

注意是完全图。

如何判定一个生成树是否是最小生成树。那么应该满足:

  • 对于任意一条非树边 \((u,v,w)\),树上 \(P(u,v)\) 中边权最大值不大于 \(w\)

而我们是完全图,所以能够理解成:

  • 对于任意 \(1 < u < v \le n\),满足 \(w_{u,v}\ge \max(w_{1,u},w_{1,v})\)

那么问题可以转化为:对于一个序列 \(a_1\dots a_n\),定义 \(f(a) = \prod\limits_{u=1}^{n}\prod\limits_{v = u+1}^{n}\max(0,k - \max(a_u,a_v)+1)\),求 \(\sum f(a)\),其中 \(n\) 为原题的 \(n-1\).

\(a\) 升序排序。那么有 \(f(a)=\prod\limits_{i=1}^{n}{\max(0,k-a_i+1)^{i-1}}\)。对这样的 \(a\) 计数就行了。

定义状态函数 \(f_{i,j}\) 表示填完 \(a_1,\dots,a_i\)\(a_i=j\) 的价值和。枚举当前填了 \(x\)\(j\),那么 \(x_0\in [i-x+1,i]\)\(f(a)\) 的贡献就是 \(\max(0,k-j+1)^{x_0-1}\),所有乘起来就是 \(\max(0,k-j+1)^{\frac{x(2i-x-1)}{2}}\)。有转移方程:\(f_{i,j}=\sum\limits_{x=1}^{i} \max(0,k-j+1)^{\frac{x(2i-x-1)}{2}} \times f_{i-x,j'}[j'<j]\times \frac{1}{x!}\)。对 \(f_{i,*}\) 做个前缀和可以做到 \(O(n^2k\log n+nk)\)

答案为 \(n! \times \sum f_{n,i}\)

P8096 [USACO22JAN] Drought G

求有多少个序列 \(h\),满足:

  • \(0 \le h_i \le 1000\)
  • 每次选择 \(1 \le i <n\),使 \(h_i \to h_{i}-1,h_{i+1}\to h_{i+1}-1\)。可以让所有 \(h\) 相同。

显然,如果最后 \(h_i = x\),可以将 \(h_i\) 统一减去 \(x\)。也就是说,我们只需要对最后能将 \(h_i\) 变成 \(0\) 的序列 \(h\) 记数,然后一个合法的 \(h\) 对答案的贡献就是 \(\min\limits_{i=1}^{n}(H_i-h_i+1)\)

显然 \(h_1\) 只能和 \(h_2\) 操作,此时 \(h_2\) 变为 \(h_2-h_1\)。而后和 \(h_3\) 操作,\(h_3\) 变为 \(h_3-h_2+h_1\)。也就是说,对于 \(i\) 需要满足:

  1. \(i\) 是奇数,奇数下标的和减去偶数下标的和不小于 \(0\)
  2. \(i\) 是偶数,偶数下标的和减去奇数下标的和不小于 \(0\)
  3. \(i=n\),和一定为 \(0\)(分 \(n\) 的奇偶看)。

维护 \(s\) 表示当前奇数减去偶数或偶数减去奇数的差值,那么 \(i \to i+1\) 相当于 \(s \to -s\) 然后加上 \(h_i\)。则我们只需要保证任意时刻 \(s \ge 0\) 且最后 \(s =0\)

定义状态函数 \(f_{i,s,j}\) 表示前 \(i\) 个数,维护的差值为 \(s\)\(\min\limits_{k=1}^{i}(H_k-h_k+1)=j\) 的方案数。枚举 \(h_i =x\),有:

\[f_{i,-s+h_i,j}=f_{i-1,s,j}[j \le H_i-h_i+1 \land h_i \ge s]\\ f_{i,-s+h_i,H_i-h_i+1}=f_{i-1,s,j}[j > H_i-h_i+1 \land h_i \ge s] \]

显然任意时刻 \(s \le V\),其中 \(V =\max\limits_{i=1}^{n}H_i\)。那么时间复杂度就是 \(O(nV^3)\) 的,考虑优化。

对于第一个式子。枚举 \(j,h_i-s=x\)。有 \(f_{i,x,j}=\sum f_{i-1,s,j}[H_i-x+1-j \ge s]\)。这是一个关于 \(f_{i,s,*}\) 的前缀和优化。

对于第二个式子。枚举 \(h_i,s\)。那么是一个关于 \(f_{i,*,j}\) 的前缀和优化。

这样时间复杂度就是 \(O(nV^2)\) 的了。答案为 \(\sum f_{n,0,i}\times i\)

好像有点问题,要对 \(n\) 的奇偶性分开 DP。不管了。

posted @ 2026-02-11 21:45  harmis_yz  阅读(6)  评论(0)    收藏  举报