2026.5 杂题

P7560 [JOISC 2021] フードコート (Day1)

其实这道题非常简单。

我们发现,你只需要求出每一个查询的人到底是这个商家的所有出现过的人中第几个即可。如果知道当前剩余的人数和当前出现过的人数就可以算出来。

求当前剩余的人数可以直接用线段树维护区间加减、对 \(0\) 取 \(\max\) 即可。求当前出现过的人数,直接用树状数组维护。

这下找到每一个询问的人是在这家商店的所有人中第几个。那么现在就需要找第几次添加时把这个人加进去了。这个直接用扫描线,对于每一个商家为横轴进行扫描,用线段树/平衡树维护所有对这个商店有添加操作的颜色,然后查询即可。

时间复杂度 \(O(n\log n)\)。

提交记录

P9991 [Ynoi Easy Round 2023] TEST_107

对于查询区间 \([L,R]\),不难想到答案区间 \([l,r]\) 有三种情况:

  • \(l=L\),且 \(a_{r+1}\) 是答案区间内没出现的颜色。
  • \(r=R\),且 \(a_{l-1}\) 是答案区间内没出现的颜色。
  • \(l>L,r<R\),且 \(a_{l-1}=a_{r+1}\) 是答案区间内没出现的颜色。

上面三种情况都可以扫描左端点或右端点用线段树解决。

时间复杂度 \(O(n\log n)\)。

提交记录

P13693 [CEOI 2025] Equal Mex

把所有 \(a\) 减一,然后转成常规意义下的 mex。

首先很容易发现的性质就是每一个分割的区间的 MEX 等于查询区间的 MEX。

所以就可以转化成在该查询区间里选尽可能多的不交的且 MEX 值等于查询区间的 MEX 的极小 MEX 区间。

这里对于极小 MEX 的区间满足 \(mex(l,r)\neq mex(l+1,r),mex(l,r)\neq mex(l,r-1)\)。

有一个 Trick: 极小的 MEX 区间个数不超过 \(2n\)。

证明:

因为是极小 MEX 区间,所以 \(a_l\neq a_r<mex(l,r)\)。

我们先钦定 \(a_l>a_r\),那么 \(a_r\) 的位置是唯一的,等于 \([0,a_l-1]\) 这些数在 \(l\) 之后第一次出现的位置的最大值。

当 \(a_l<a_r\) 也是同理。

所以个数不会超过 \(2n\)。

所以把所有的极小 MEX 区间求出来,然后把所有 mex 等于查询区间的 mex 的取出来,然后用倍增去贪心地求即可。

时间复杂度 \(O((n+q)\log n)\)。

提交记录

P10644 [NordicOI 2022] 能源网格 Power Grid

首先考虑什么样的 \(X,Y\) 能够一定生成出合法的 \(A\)。我们发现 \(\sum X=\sum Y\) 是一个必要条件,同时我们也可以发现其充分性:对于满足 \(\sum X=\sum Y\) 的一组 \(X,Y\),我们可以把右下角的 \((n-1)\times (m-1)\) 的位置全填成任意数,然后剩下的一行一列按要求和的要求填就行了。这样一定可以填出来一个合法的 \(A\)。

现在就可以完全扔掉 \(A\),只看 \(X,Y\) 了。只需要构造出一组 \(X,Y\) 满足 \(\sum X-\sum Y=0\) 且满足 \(C_{i,j}=|X_i-Y_j|\) 即可。

此时我们继续观察,找到 \(C\) 最大的那个位置 \((s,t)\),则此时一定有 \(C_{s,t}=\max X-\min Y\) 或 \(C_{s,t}=\max Y-\min X\)。这两种情况是对称的,所以我们钦定 \(C_{s,t}=\max X-\min Y\),然后做完后再转置再做一遍即可。

我们可以发现,\(\max X=\max(X,Y)\) 和 \(\min Y=\min(X,Y)\) 中至少有一个满足,我们把两种情况都枚举一遍,若 \(\max X=\max(X,Y)\),则转置一下就有 \(\max Y=\max(X,Y)\),钦定 \(\max Y=0\),此时 \(X_i=-C_{i,t}\);若 \(\min Y=\min(X,Y)\),则钦定 \(\min Y=0\),此时 \(X_i=C_{i,t}\)。

进一步地,我们发现,我们可以对所有的 \(X_i,Y_i\) 加一,这样并不会影响 \(C\) 的满足性,但是可以让 \(\sum X-\sum Y\) 多一个 \(n-m\)。所以当 \(n\neq m\) 时,我们可以通过这个操作让条件变为 \(\sum X\equiv \sum Y\pmod {|n-m|}\),然后再通过全部一起加减来满足 \(\sum X=\sum Y\)。

于是现在我们已经知道了所有的 \(X\),那么对于任意的 \(Y_j\),它最多有两个取值(并且这个取值会根据刚刚的钦定满足要么非负要么非正)。我们想让最终的 \(\sum X\equiv \sum Y\pmod {|n-m|}\)。所以考虑背包去做这个事情。这里时间复杂度是 \(O(n\times mod)=O(n^2)\)。

但是当 \(n=m\) 时,我们必须让 \(\sum X=\sum Y\),所以只能用 bitset 去维护出 \(\sum Y\),那么时间复杂度就是 \(O(\frac{n^2V}\omega)\)。为了方便,我们可以把上面那个背包也写成 bitset。

总结下来就是做四次操作,钦定 \(\min Y=\min(X,Y)\),再钦定 \(\max X=\max (X,Y)\),然后转置后再做一遍。哪一次找到合法解就直接输出即可。

提交记录

CF1768F Wonderful Jump

这道题注意到从 \(i\to j\) 的代价 \(\le (j-i)V\le n(j-i)\),因为可以一步一步地跳。所以如果我们选择一次性从 \(i\to j\) 那么有:\(\min(a_i,...,a_j)(j-i)^2\le (j-i)n\),所以要么 \(j-i\le \sqrt n\),要么 \(\min(a_i,...,a_j)\le \sqrt n\)。

对于第一种,直接暴力即可。对于第二种,考虑枚举最小值,此时有一个性质:若从 \(i\to j\) 跨过了 \(a\) 地最小值所在位置 \(k\) 满足 \(i<k<j\),那么从 \(i\to k\) 再从 \(k\to j\) 是不劣的。所以直接枚举每一个最小值所在位置 \(x\),找到 \(l,r\) 分别是前后第一个位置满足 \(\ge a_x\)。然后从 \((l,x)\) 转移到 \(x\),再从 \(x\) 转移到 \((x,r)\)。

这样做是 \(O(n\sqrt n)\)。

提交记录

CF260E Dividing Kingdom

我想的是枚举第一根横线,然后枚举最左上角的位置对应的哪一个儿子,以此来确定第一个竖线。然后再枚举最上方的土地是给谁的,以此来确定第二根竖线的位置。然后枚举最左边的土地是给谁的,以此来确定第二根横线的位置。然后进行判定是否合法。这样做是 \(O(9^3n\log ^2n)\),非常不能过。不过应该跑不满,没试过。

其实忘了有一个方向,就是可以提前 \(9!\) 枚举每一个土地分给那个儿子。然后确定每一个线的位置可以直接线段树二分,进行判定时直接二维数点做就完了。这样做是 \(O(n\log^2n+9!\log ^2n)\)。

CF325E The Red Button

首先 \(n\bmod 2=1\) 则无解,原因是考虑 \(0\) 和 \(n-1\) 的前驱,一个是 \(\{0,\frac{n-1}2\}\),另一个是 \(\{n-1,\frac{n-1}2\}\),然后又不能选自己,所以一定无解。

然后考虑 \(n\bmod 2=0\),考虑 \(i\) 和 \(i+\frac n2\) 的后继,我们发现他们的后继集合都是 \(\{(2i)\bmod n,(2i+1)\bmod n\}\),它们中必须有一个是选的前面那个后继,一个是选的后面那个后继,所以可以把他们考虑成一个节点。这样我们把所有 \(n\) 个树都考虑成 \(\frac n2\) 个节点后,直接进行连边,把这个点连向其后继对应的点,这样所有的边都必须被访问,于是就变成了一个求欧拉回路的问题,直接跑欧拉回路即可。每个节点恰好被经过两次( \(0\) 节点经过三次)。

这道题就是典型的把哈密顿回路转化成欧拉回路的技巧。

提交记录

P11918 [PA 2025] 考试 / Egzamin

首先肯定优先选 \(p_i\) 更大的,所以把 \(p_i\) 从大到小排序,这样就只用在意选多少个。

然后就可以直接 \(dp\),设 \(dp_{i,j}\) 表示取前 \(i\) 个得分为 \(j\) 的概率。直接 \(dp\),时间复杂度是 \(O(n^2)\)。

但是我们发现有很多位置的 \(dp\) 值很小,所以考虑当 \(dp\) 值很小的是,可以忽略,那么最后大于一个阈值的只会集中在一段。如果钦定阈值为 \(\epsilon\),那么长度为 \(O(\sqrt{n\ln {\epsilon}^{-1}})\)。

所以时间复杂度为 \(O(n\sqrt{n\ln {\epsilon}^{-1}})\)。

提交记录

P9669 [ICPC 2022 Jinan R] DFS Order 2

设 \(dp_{u,k}\) 为不考虑 \(u\) 的子树的贡献,其他节点的贡献使得 \(u\) 在 dfs 序中第 \(k\) 个位置的方案数。

设 \(wys_u\) 为只考虑 \(u\) 的子树的 dfs 序个数,这个很简单,就是 \(wys_u=son_u !\prod_{v\in son_u}wys_v\)。

考虑对于一个节点而言,我们需要选择一些儿子放在目标节点的前面,一些节点放在目标节点的后面,设放在前面的有 \(j\) 个,放在目标节点 \(x\) 后面的有 \(k\) 个,则方案数为 \(j!k!\prod_{v\in son_u,v\not\in ancestor(x)}wys_v\),会使得 \(x\) 比 \(u\) 向后移这放在前面的 \(j\) 个儿子的子树大小之和个位置。

直接 dp 是 \(O(n^4)\) 的,考虑可撤销背包。计算出所有儿子的方案再减去目标子树的方案。

设 \(g_{v,j}\) 表示考虑 \(v\) 的所有兄弟,选出了子树大小之和为 \(j\) 的兄弟放在 \(v\) 前面,且已经考虑这些兄弟之间的顺序的方案数。

同时记录 \(f_{j,k}\) 为考虑 \(u\) 的所有儿子,选出了子树大小和为 \(j\) 的 \(k\) 个儿子,且考虑了顺序的方案数。这个是可以 \(O(n^3)\) 求出来所有的。

那么考虑 \(g\) 和 \(f\) 的关系,我们发现 \(g_{v,j}\) 不能很好地表示,所以再加一维: \(g_{v,j,k}\) 表示 \(v\) 的兄弟选了子树大小和为 \(j\) 的 \(k\) 个兄弟,且考虑兄弟之间顺序的方案数,则有:

\[g_{v,j,k}\times wys_v\times (son_u-k)+g_{v,j-sz_v,k-1}\times wys_u\times k=f_{j,k} \]

变换一下,则有:

\[g_{v,j,k}=\frac{f_{j,k}/wys_v-g_{v,j-sz_v,k-1}\times k}{son_u-k} \]

于是可以 \(O(1)\) 算出所有的 \(g_{v,j,k}\)。状态数总共是 \(O(n^3)\) 的。

于是转移到 \(dp_v\) 就是:

\[dp_{v,j+k+1}\gets dp_{u,j}\times \sum_lg_{v,k,l} \]

答案 \(ans_{u,i}=dp_{u,i}\times wys_u\)。

总时间复杂度为 \(O(n^3)\)。

提交记录

P12544 [UOI 2025] Boys and Girls

这个题出到模拟赛,要求 \(O(n)\)。

首先就是两种情况:菊花或者三元环权值的最大值。这个原题求三元环直接 \(O(m\sqrt m)\) 求即可,提交记录.

如何做到 \(O(n)\)?注意到如果答案是一个三元环的话,那么这三个点中一定至少有一个点满足:这个三元环上这个点连出的两个边中是这个点连出的所有边中权值最大的两个边。

证明很简单,考虑反证。设 \(x,y,z\) 为三元环上三条边的边权,考虑 \(x,y\) 这两条边的共同端点,那么反证就存在另外一条这个点连出的边,设其边权为 \(w\),则有 \(\min(x,y)<w\),而又因为这个三元环要比选这个菊花更优,也就是 \(x+y+w<x+y+z\),所以有 \(w<z\)。综合起来就是 \(\min(x,y)<w<z\),把 \(w\) 扔掉,就是 \(\min(x,y)<z\)。如果三个点都不满足上述条件则有 \(\min(x,y)<z,\min(x,z)<y,\min(y,z)<x\),显然不成立。

所以只考虑每一个节点权值最大的两条边即可。时间复杂度 \(O(n)\)。提交记录(这里实现写的是 \(O(n\log n)\))

CF311C Fetch the Treasure

这个题最终要的是想到如何判断一个位置能否被走到。因为每一种步长都只能走非负整数步,而且第一个步长 \(k\le 10^4\)。这就启发我们做同余最短路。而又因为步长 \(\le 21\),所以每一次新增一种步长就重新跑一遍同余最短路即可。其他东西都是好维护的,可以用堆或者 set。时间复杂度 \(O(20^2k\log (2k)+q\log n+20n\log n)\)。

提交记录

QOJ12529 Fibonacci's Nightmare

求方差的期望值,方差的期望的计算公式是:\(E(a_n^2)-(E(a_n)^2)\)。也就是平方的期望减去期望的平方。

那么首先考虑计算 \(E(a_n)\),考虑枚举前面两个的位置,则有(注意下标从 \(0\) 开始,所以有 \(n^2\) 种选择):

\[\begin{aligned} E(a_n)&=\frac{1}{n^2}\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}E(a_i+a_j) \\&=\frac{2}{n^2}n\sum_{i=0}^{n-1}E(a_i) \\&=\frac{2}n\sum_{i=0}^{n-1}E(a_i) \end{aligned}\]

然后考虑计算 \(E(a_n^2)\),则有:

\[\begin{aligned} E(a_n^2)&=\frac{1}{n^2}\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}E[(a_i+a_j)^2] \\&=\frac{1}{n^2}\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}E[a_i^2+a_j^2+2a_ia_j] \\&=\frac{1}{n^2}\bigg(2n\sum_{i=0}^{n-1}E(a_i^2)+2E\bigg(\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}a_ia_j\bigg)\bigg) \\&=\frac{2}n\sum_{i=0}^{n-1}E(a_i^2)+\frac{2}{n^2}E\bigg(\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}a_ia_j\bigg) \end{aligned}\]

前面那项可以递归计算,考虑后面那项:

\[\begin{aligned} E\bigg(\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}a_ia_j\bigg)&=E\bigg(\bigg(\sum_{i=0}^{n-1}a_i\bigg)^2\bigg) \\&=E\bigg(\bigg(a_{n-1}+\sum_{i=0}^{n-2}a_i\bigg)^2\bigg) \\&=E\bigg(a_{n-1}^2+2a_{n-1}\sum_{i=0}^{n-2}a_i+\bigg(\sum_{i=0}^{n-2}a_i\bigg)^2\bigg) \\&=E(a_{n-1}^2)+E\bigg(2a_{n-1}\sum_{i=0}^{n-2}a_i\bigg)+E\bigg(\bigg(\sum_{i=0}^{n-2}a_i\bigg)^2\bigg) \end{aligned}\]

带入 \(E(a_{n-1})=\frac{2}{n-1}\sum_{i=0}^{n-2}a_i\),则有:

\[\begin{aligned} E\bigg(\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}a_ia_j\bigg)&=E(a_{n-1}^2)+\frac{4}{n-1}E\bigg(\bigg(\sum_{i=0}^{n-2}a_i\bigg)^2\bigg)+E\bigg(\bigg(\sum_{i=0}^{n-2}a_i\bigg)^2\bigg) \\&=E(a_{n-1}^2)+(1+\frac{4}{n-1})E\bigg(\bigg(\sum_{i=0}^{n-2}a_i\bigg)^2\bigg) \end{aligned}\]

注意等号左边这项也等于 \(E\bigg(\bigg(\sum_{i=0}^{n-1}a_i\bigg)^2\bigg)\),所以这个就是一个递推式:

\[\begin{aligned} E\bigg(\bigg(\sum_{i=0}^{n-1}a_i\bigg)^2\bigg)&=E(a_{n-1}^2)+(1+\frac{4}{n-1})E\bigg(\bigg(\sum_{i=0}^{n-2}a_i\bigg)^2\bigg) \end{aligned}\]

综上所有东西都可以用递推求出,时间复杂度 \(O(n)\)。

提交记录

posted @ 2026-10-26 20:12  Daylighten  阅读(3)  评论(0)    收藏  举报