loading

杂题/模拟赛题

QOJ15502 CTT2025 D1T2 字符串问题

不难发现整周期的最小性很难维护。根据忘了哪个定理或者感性理解,所有的整周期一定是最小整周期的倍数,于是考虑莫比乌斯反演,设 \(d\) 为最小整周期,则我们希望 \(f(\frac{r-l+1}{d})=\sum_{k|\frac{r-l+1}{d}} g(\frac{r-l+1}{kd})\) 而将贡献转化为统计 \(g\) 的贡献(去掉了最小性的限制)。根据上式得到 \(f=g*1\),因此 \(g=f*\mu\),枚举倍数预处理一下就能得到 \(g\),复杂度 \(O(n\log n)\)

考虑怎么统计贡献。\(g(1)\) 是平凡的,对于其他的数,枚举整周期 \(d\),不难发现如果序列 \([l,r](d|r-l+1)\) 合法当且仅当 \(\forall i\in[l+d,r],s_i=s_{i-d}\)。按照优秀的拆分套路按块长 \(d\) 分块,求一下相邻块开头的 lcp 和相邻块结尾的 lcs(这个可以 sa 维护),我们能得到若干个极长的满足 \(s_i=s_{i-d}\) 的连续段,再枚举一下倍率 \(k\),能贡献到的位置显然是一段区间,差分维护即可,可以证明有用的操作次数是 \(O(\frac{n}{d})\) 的,所以总复杂度 \(O(n\log n)\)

QOJ15618 Minimizing Wildlife Damage

模拟赛 T3。首先我们希望找到一个多项式复杂度的做法。

不难发现操作完之后最终会存在一段区间被删了一半,这段区间之后的数全部保留了下来,而这段区间之前的数全部被删除。枚举该区间 \([i,j]\),设 \(i\) 之前最多能顶住 \(g_i\) 次操作,则有答案 \(ans=s_i-a_{j+1}-(k-g_i)\cdot (j-i+1)\),其中要满足 \(k\ge g_i\) 且不被删到 0。不难发现把条件转化为 \(g_i\le k\le g_i+a_i\) 不会更劣,因为如果 \(a_i\) 没被删空而存在一个 \(a_p\) 被删空,那么我们把 \(p\) 删掉会更优,算出来的答案会比这个式子更优。

怎么求 \(g_i\)?再次发现一个性质:\(i-2\) 之前选最大独立集最优(由于 \([i,j]\) 自成区间所以 \(a_{i-1}\) 必被删),即不存在两个相邻的不为 0 的数。原因是由于都被删掉了,所以把区间内的最小值删掉,\(g_i\) 的值不会变小。最大独立集直接 dp 即可。复杂度 \(O(qn^2)\)

进一步发现由于 \(g_i+a_i\le g_{i+2}\),所以奇偶性相同的两个区间交点只可能是 \(g_i+a_i\)。随便画个图推一推可以发现此时选 \(i+2\) 不会更劣,由此得到有用的 \(i\) 只有 \(O(1)\) 个。实际上,找到第一个 \(\le k\)\(g_i\),只有 \(i\)\(i-1\) 是可能有用的。复杂度 \(O(n^2+q\log n)\)

考虑进一步优化,把贡献式子写出来:\(ans=s_i-a_{j+1}-(k-g_i)\cdot (j-i+1)=-j(k-g_i)-a_{j-1}+(k-g_i)(i+1)+s_i\),不难发现对于每个询问 \(i,k\) 相关的东西是已知的,当做常数处理,而剩下的就是关于 \(k-g_i\) 的一次函数,我们相当于要求一段后缀内所有一次函数在某个 \(x\) 下的最大值,直接从后往前扫描线 \(i\) 即可。复杂度 \(O(n\log n)\)

CF2178G deCH OR Dations

将圆拍成一个序列,不难发现弦相交相当于序列上两段区间相交。考虑到计算每个 \(i\) 的贡献太难做了,由于我们只想知道每个 \(i\) 出现了奇数次还是偶数次,考虑异或哈希,如果异或为 0 则说明都出现偶数次,设 \(f_i\) 表示以 \(i\) 为结尾的权值异或和,\(g_i\) 表示以 \(i\) 结尾的方案数模 2。转移就是把所有与其相交的区间的 \(f,g\) 异或起来,再将 \(f_i\) 异或上 \(g_i\) 倍的该点随机权值。但发现相交条件是三维偏序(还有下标限制),至少要做到 \(O(n\log^2 n)\),观察到相交等价于只有一个端点在另一个区间内,而若有两个端点在里面可以尝试异或消掉,于是只需要把贡献拆到端点上即可,树状数组维护区间和,复杂度 \(O(n\log n)\)

CF2178H Create or Duplicate

\(a,b,c\) 的系数写成二进制数的形式,那么单点加就相当于在当前最末位加 1,翻倍就相当于右移。但每一位上的数字可以不止 1,那系数就得表示成 \(\sum a_i\cdot 2^i\) 的形式。设 \(f_i\) 表示模 \(m\)\(i\) 的最小代价,由于三个系数的最高位不同,所以还要再额外记录一个 \(mask\) 表示三个系数是否非 0,转移可以考虑加 \(a,b,c\),也可以考虑翻倍,代价是 \(k\cdot \operatorname{popcount}(mask)\),答案就是 \(mask=7\)\(f_0\) 的值。转移用 dij 维护。复杂度 \(O(8m\log m)\)

CF2178I Numbers or Fireworks

结论:将欧几里得距离为 \(\sqrt k\) 的点连边,则原图是二分图。

证明:若 \(k\) 为奇数,则将格点黑白染色得证。若 \(k\) 为偶数,黑白染色后必然是白白连边和黑黑连边,两种情况独立,不妨考虑白白连边的图,坐标除掉 \(\sqrt 2\) 后旋转 \(45\) 度不仅可以 \(k\) 减半还保证了整点的性质,继续除到奇数即可,结果是若干个二分图拼起来,还是二分图。

有了这个性质就好做多了,\(\prod c+1\) 拆成组合意义就是对于不在集合中的点要么不选要么选择一个与其相连且在集合内的点。将点集小的当做左部点,枚举左部点哪些被在集合中,对右部点 dp,对于一个点,要么不选他,转移就乘上(左部点与其相邻的在集合中的点的个数 +1);要么选他,则在所有 不在集合中且还没有连边的点 当中选若干个与其连边,设 \(f_{i,S}\) 表示考虑到第 \(i\) 个右部点,左部点中不在集合里且没被连边的集合为 \(S\),相当于选集合的子集的子集,复杂度 \(O(n4^{\frac{n}{2}})\)。不难发现枚举子集太蠢了,我们完全可以逐位确定子集中没被选的点是否与该点连边,复杂度降到 \(O(n^23^{\frac{n}{2}})\),看起来不太能过但随便加点小剪枝(甚至啥都不加)就过了。

zr 一轮省集 C

题意:给定 \(a_1,a_2,\cdots,a_n\) 和常数 \(A,B\),你需要重排序列使得对于所有 \(1\le i<n\) 都满足 \(a_i+a_{i+1}=A\)\(a_i-a_{i+1}=B\)。判断解的存在性并给出构造。

首先两个式子看上去就不可做,考虑能不能变成一个式子?只考虑 \((a_i,a_{i+1})\) 是否合法,将 \(a_i\) 视为横坐标,\(a_{i+1}\) 视为纵坐标,则该点需要位于直线 \(x+y=A\)\(x-y=B\) 上。考虑到两条直线交点是 \((\frac{A+B}{2},\frac{A-B}{2})\),并且两条直线斜率的绝对值都为 \(1\)(即都与坐标轴成 \(45\) 度角),以该点为原点建系(两条轴方向正常),转化为点的坐标离两条坐标轴距离相等,形式化写出来就是 \(\lvert x-\frac{A+B}{2}\rvert=\lvert y-\frac{A-B}{2}\rvert\)。相邻三个点合法就是 \(\lvert a_i-\frac{A+B}{2}\rvert=\lvert a_{i+1}-\frac{A-B}{2}\rvert\wedge\lvert a_{i+1}-\frac{A+B}{2}\rvert=\lvert a_{i+2}-\frac{A-B}{2}\rvert\)\(\lvert a_{i+1}-\frac{A-B}{2}\rvert\)\(\lvert a_{i+1}-\frac{A+B}{2}\rvert\) 连一条边,跑一个欧拉路径即可,复杂度线性。

HT-093 省选模拟赛 A

直接模拟做竖式除法由于循环节长度过长而会 TLE。考虑 \(d=1\),此时模拟竖式可以发现整除当且仅当 \(m|n\),且商为 \(\sum_{m|i,0\le i<n}10^{i}\),设这个数为 \(X\)。推广到 \(d\) 任意的情况就是求 \(\frac{X}{d}\) 的值,这样除数变小,循环节长度就可接受了。由于需要记录第几位以及余数是多少,所以循环节总长度 \(O(md)\)

ARC212F Add Integer

打表/发挥注意力可以注意到如果得到了 \(a_k,a_{k+1}\),那么我们可以唯一确定 \(a_{k-1}=\lvert a_k-a_{k+1}\rvert\),由于最终的 \(a_n\) 已经确定,枚举 \(a_{n-1}\),我们能确定唯一的 \(a_1,a_2\)。发现这个递推过程和辗转相除很类似,考虑照这这个推一推,发现 \((x,y)\) 能在三轮迭代后得到 \((x,y-2x)\)\((x-2y,y)\)(取决于 \(x,y\) 大小关系),余下的 \(O(1)\) 个操作暴力迭代即可,复杂度是辗转相除的 \(O(V\log V)\)

CF2183G Snake Instructions

发现有 -1 的情况,想想什么情况下会 -1。当存在相邻的三个位置上第一个和第三个位置上是路障(速度 0)且第二个位置不是路障时无法判断是 1 还是 2。

我们考虑问 LLR,显然前者会让某些蛇被创飞,后者会让前者没创飞的蛇回归原位。结合两个 vector 里一条蛇的位移大小可以确定没被创飞的蛇的速度。同时,由于路障不会被创飞,所以同时得到了全部路障的位置。

考虑剩下的蛇,一共有以下几种情况:

  • 0x2x 是一条蛇或一个空位。
  • 12
  • 0102
  • 以上字符串的最后一个字符代表被创飞的蛇的速度。

前两个条件和解的存在性根据场上信息直接就可以拿出来蛇的速度,而第三种情况我们无法判断是 1 还是 2。考虑询问 R,此时这条仍没确定的蛇左侧不再有任何捣乱的蛇,若这条蛇的速度是 1,那么若有解,它一定会成功走到 \(a_i+1\) 位置上;否则,要么成功走到 \(a_i+2\) 上,要么被创飞,但 \(a_i+1\) 上必然不会有元素。所以直接二分第一个大于 \(a_i\) 的元素是不是 \(a_i+1\) 即可。

代码源省选 Day8 B

发挥打表能力/注意力观察到将 \(1,2n-1\) 位置上的负数剪掉后人类一定会取全局,由于所有偶数都没有值,所以若奇数上是负数我们可以在偶数上放 \(k\) 使得答案不劣。

枚举机器人的答案然后从前往后做一遍 dp 即可,即设 \(f_i\) 表示前 \(i\) 个元素在每一段极长非负权连续段权值之和都不大于枚举的数的前提下的总和最大是多少,钦定 \(i\) 是负数。转移考虑枚举上一个负数的位置,并且保证中间没有负数,然后权值是 \(\min(lim,s_i-s_{j})\),这里要默认偶数填 \(k\)。复杂度 \(O(n^4)\)

再次发挥打表能力/注意力观察到偶数只会填 \(-1\)\(k\),显然不会填 \(-2\) 或更低,其次填 \(<k\) 的值将其提高为 \(k\) 答案不会更劣(虽然可能这会导致机器人答案会更高,但若机器人答案变高那一定说明存在另一个连续段的总和和原先的机器人区间一样,所以差不变)。这有啥用呢?要是枚举机器人答案那复杂度不会变化,考虑枚举人类答案,发现如果我们记录 -1 的个数,那么人类答案已经确定,我们此时只需要记录最小的机器人答案即可。设 \(f_{i,j}\) 表示前 \(i\) 个元素,钦定 \(i\) 是负数,有 \(j\) 个偶数填了 -1 的机器人答案最小是多少,转移还是枚举上一个负数 \(i_0\),有转移 \(f_{i,j}=\min_{i_0}\{\max(f_{i_0,j-[2|i_0]},s_{i-1}-s_j)\}\),这里的前缀和还是钦定偶数是 \(k\)。注意还是要钦定中间没有负数。复杂度 \(O(n^3)\)

考虑优化。先简化一下式子,发现 \(i_0\) 为奇数肯定说明其本来就是负数,并且由于中间不能有负数,所以奇数转移只有这一个,记录一下这个位置即可;现在只考虑偶数转移,把 \(\max\) 拆掉并分类讨论一下,若 \(f_{i_0,j-1}\le s_{i-1}-s_{i_0}\),移项变成 \(f_{i_0,j-1}+s_{i_0}\le s_{i-1}\),注意到有效的区间不包含负数,所以 \(f_{i_0,j-1},s_{i_0}\) 关于 \(i_0\) 都递增(虽然前者不需要用到这个性质),所以 \(f_{i_0,j-1}+s_{i_0}\)\(s_{i-1}\) 也递增,所以有效的 \(i_0\) 是一段前缀,此时需要求 \(\min s_{i-1}-s_j\)\(\max s_j\),维护一下前缀 max 即可;对于后面,维护 \(f\) 的单调队列即可。实现上,由于 \(f,s\) 递增,所以真正有用的转移点只有分界点前后两个,省下了一大笔代码量。复杂度 \(O(n^2)\)

代码源省选 Day9 B

\((i,j)\) 上有操作则令其权值为 1,否则为 0。发挥注意力观察到对于一个点 \((i,j)\),将它四周的 \(A_{i,j}\) 加起来相比于其同倍数的本身多加了其所在的两条对角线,即,设 \(X_{i,j}\) 表示 \((i,j)\) 所属的两条对角线上权值之和(本身算两遍),则有 \(X_{i,j}=\frac{A_{i-1,j}+A_{i,j-1}+A_{i+1,j}+A_{i,j+1}-4A_{i,j}}{2}\)。设 \(P_k\)\(i-j=k\) 这条主对角线上权值之和,\(Q_k\)\(i+j=k\) 这条副对角线上权值之和,则显然有 \(X_{i,j}=P_{i-j}+Q_{i+j}\)。我们希望得到 \(P,Q\),发现奇偶独立所以分开做,将一个点视作一条边,横坐标向纵坐标连边,得到一张连通图。选出其中的一棵生成树可以得到 \(2n-1\) 个线性无关的方程,加上 \(\sum P=\sum Q\) 就有了 \(2n\) 个方程,解就行了。解出来后需要构造满足 \(P,Q\) 限制的选点,直接流肯定会 T,考虑到越往边上的主对角线所连的副对角线越少,限制越紧,所以考虑限制由紧到松做,贪心的选择 \(Q\) 最大的副对角线连即可。复杂度 \(O(n\log n)\),注意有大量细节,反正我又不写,所以懒得赘述了。

CF2190D Prufer Vertex

先考虑怎么求 \(v\)。考虑一个很特殊的点:\(n-1\),思考它在什么情况下会被删掉,答案是叶子只有 \(n-1,n\) 时它会被删掉。而最终一定会被删成这样的形式,故 \(v\)\((n,n-1)\) 链上最靠近 \(n\) 的那个点。

再考虑求方案数。要是直接枚举链需要至少一个分治 NTT,不好做。考虑 \(n\) 所属的连通块的点集 \(S\),由于这些点本质相同,所以 \(n-1\) 连在 \(S\) 中每一个点的概率都相等,若假设 \(v\in S\),则答案为 \(v\) 的概率即为 \(\dfrac{siz_v}{\lvert S\rvert}\),求出总方案数在乘上它即可。若 \(v\not\in S\),只需要钦定 \(v\)\(n\) 连边即可,此时连通块数和 \(\prod s_i\) 会改变,这个容易维护。复杂度 \(O(n)\)\(O(n\log n)\)

CF2190E Median Permutation

先考虑判定,注意到 \(1,n\) 不可能成为中位数,而又有 \(n-2\) 个中位数,故所有中位数是 \(2\sim n-1\) 的排列。不妨设 \(pos_1<pos_n\),考虑 \(1\) 左侧的点,由于中位数是排列,所以不能有数没出现,可以推出 \((p_1,p_2,p_3)\) 的中位数一定是 \(p_1\),枚举一下 \(p_2,p_3\) 的大小关系然后一直往后推到 \(1\) 即可。推完发现 \(1\) 左侧的数的大小关系一定是 \(pos_1\) 往其前面两个位置直到连不了,然后 \((1,2)\) 连边(方向取决于最终在 \(1\) 还是在 \(2\)),然后一直往后两个位置连边,连边表示出点比入点小。\(n\) 右侧同理。对于 \(1,n\) 中间的位置,上述的推理过程不成立,但是我们打个表发现结论和两边很类似:奇偶下标分别递增。

考虑计数。把这些边连上,会形成两条数链(注意 \(1,n\) 位置的奇偶性差异会导致数链的形态不同,要分开求)。直接上网格图,初始在 \((0,0)\),假设往上走代表第一条数链前进了一位,往右走亦然。那么一个有值的点就相当于要求在 \(x+y=a_u-2\)\(x/y=i\) 点处,要求必须到达这个点且必须往上或右走。把起点终点丢进 vector 里排个序然后计算从前一个点到后一个点的方案数即可,这个显然是 \(\dbinom{x_2-x_1+y_2-y_1}{x_2-x_1}\)。复杂度 \(O(n)\)

P14983 [USACO26JAN1] Hoof, Paper, Scissors Triples P

这不是 MO 题???

平均胜利指的是胜率严格高于败率,若不考虑等于的情况就是竞赛图三元环,答案为 \(\binom{n}{3}-\sum\binom{deg_i}{2}\)。前面是好算的,考虑后面,需要计算度数,则若 \(i\rightarrow j\) 需要有(设 \(a,b,c\) 分别代表石头/布/剪刀)\(a_i(c_j-b_j)+b_i(a_j-c_j)+c_i(b_j-a_j)>0\),发挥数学直觉/注意力/数竞思维/奇思妙想把最后一项 \(c_i(b_j-a_j)\) 拆掉,拆成 \(c_i(b_j+c_j-c_j-a_j)=c_i(c_j-a_j)+c_i(b_j-c_j)\),原式变成 \((a_i-c_i)(c_j-b_j)+(b_i-c_i)(a_j-c_j)=(b_i-c_i)(a_j-c_j)-(a_i-c_i)(b_j-c_j)>0\),发现最终写成了 \((b_i-c_i,a_i-c_i),(b_j-c_j,a_j,c_j)\) 叉积大于 0 的形式。根据向量知识可以得到叉积正负性只与两个向量的相对位置有关,极角排序后若第 \(i\) 个点的极角是 \(\theta\),则极角范围在 \((\theta,\theta+\pi)\) 内的点与其叉积大于 0,双指针扫一下即可。

现在有等于的情况,若等于那肯定是叉积为 0,此时要么同向要么反向。对于前面的 \(\binom{n}{3}\),此时要改成选出三个点使得两两有边,将所有极角变成 \([0,\pi)\) 的范围(或者你喜欢的形式)后从前往后扫一下维护选 1/2/3 个的方案数即可,如果直接加减 \(\pi\) 可能会有精度误差,我们只需要在 \(y<0\)\(y=0\wedge x<0\) 时把 \(x,y\) 同时取反即可(后者是因为此时 \(\theta=\pi\),需要把他变为 \(0\)样例检查不出来)。不知道为啥,直接对浮点数开 map 存次数在开 long double 的前提下是对的。

对于后面的 \(\binom{deg_i}{2}\),仍然拆成选择 \(i\)\(x,y\) 都有边且 \(x,y\) 有边的情况,注意此时不能合并两个反向的向量。仍然双指针,维护选一个和选两个的方案数,加入和删除都是容易的。复杂度 \(O(n\log n)\)

CF1801G A task for substrings

首先肯定是建 ACAM,然后发现区间询问没得做,考虑差分一下用前缀形式表示,一个前缀的答案是很容易 \(O(|t|)\) 求的。假设询问区间是 \([l,r]\),设前缀 \(i\) 的答案是 \(pre_i\),那么直接 \(pre_r-pre_{l-1}\) 发现会把右端点在区间内但左端点在区间外的情况算进去了。你考虑,对每个点预处理右端点为 \(i\) 能匹配上的最长的串编号,如果最远的左端点在 \(l\) 右边则无视发生;若在左边,设最右边的满足这个条件的点为 \(p\),则 \(p\) 右边还是可以 \(f_r-f_p\),左边的串你会发现它显然是一个 \(s_i\) 的后缀,那么我们成功的把询问放在了 \(s_i\) 上,我们想要求 \(s_i\) 的一段后缀中的答案,对反串建 ACAM 还是容易求的。查 \(p\) 需要线段树二分。复杂度 \(O(S+q\log |t|+|t|)\)

ARC213B Hamming Distance is not 1

脑子燃尽了。贺篇题解吧。

首先注意到对于一个偶数 \(x\)\(x,x+1\) 不能同时在集合内,所以答案有上界 \(\lceil\frac{r-l+1}{2}\rceil+1\),极限情况是 \(l\) 是偶数 \(r\) 是奇数;再次注意到取 popcount 奇偶性相同的数总是合法的,所以答案有下界 \(\lceil\frac{r-l+1}{2}\rceil\)。在不为上界的极限情况下上界是取不到那个 \(+1\) 的,所以答案已经确定;如果取到了上界,那么若 \(l,r\) popcount 奇偶性相同则取所有奇偶性和他俩相同的数就顶到上界;考虑一般情况,假设 \(p\) 为最高的满足 \(l,r\) 在此位不同的位,按照 \(p\) 位上的值分为两部分,若 \(l+2^p>r\) 则说明把 \(l\) 这一边的第 \(p\) 位换成 1 会全大于 \(r\),此时 \(l\) 侧选和 \(l\) 相同的 \(r\) 侧选和 \(r\) 相同的,因为 \(l,r\) popcount 奇偶性不同,所以 \(p\) 位以下至少会有一位不同,所以合法;否则,会导致有 \(x,x+1\) 被同时选,此时不合法,答案只能取到下界。构造是平凡的。复杂度 \(O(n\log V+\sum q(R-L))\)

QOJ4892 [2021 集训队互测] 序列

这个条件等价于中位数等于 \(x\),发现这不好做。先注意到一个性质,这些数只会取到 \(m\) 个限制中出现过的数,否则直接调整成出现过的数即可。一个很重要的转化是,将中位数等于 \(x\) 转化为有至少两个数 \(\ge x\)\(\le x\),很容易观察到这就是 2-SAT,直接建图 \(O(nm)\),再次注意到一个数的值只会是在这个点上有限制的限制中出现过的数,所以总点数线性,复杂度瓶颈也就是离散化。

QOJ2570 Maximal Subsequence

题意要求我们选出最多的点使得这些点构成的序列不存在长度为 \(m\) 的上升子序列,其中 \(m\) 是原序列 LIS。我们这样想,选出所有上升子序列,然后让这些子序列里都有元素没选,求最小的没选的元素个数即可,这其实是最小割,然后建图建出来就是:设 \(f_i\) 为以 \(i\) 结尾的 LIS 长度,则 \(i\rightarrow j\) 当且仅当 \(i<j,a_i<a_j,f_i+1=f_j\),拆点跑最小割即可。

最小割没有前途,转最大流然后模拟最大流。当然模拟最大流也没啥前途,但是我们发现这个最大流本质上在求选出若干个原序列的子序列的最大数量使得序列无交且序列为长为 \(m\) 的上升序列。这玩看起来有前途多了,先把没有用的点扔掉(没有用的点是永远不会出现在 LIS 中的点,这个容易求出),把剩下的点按照 \(f_i\) 分个层然后转化成每一层选一个数(删掉之后会有很多优美的性质),但还是没法做。发现一些简要性质:

  • 对于一层中的点,\(a_i\)\(i\) 增大而减小。这是因为如果存在一个 \(i'\) 满足 \(a_i<a_{i'}\) 那么 \(f_{i'}\ge f_i+1\neq f_i\)
  • 对于一个 \(i\),它的上下两层合法的 \(j\) 是一段区间。以上一层为例,合法的下标是一段前缀,合法的值是一段后缀,并起来就是区间。
  • 对于一层中的两个点 \(i,j(i<j)\),设 \([l_i,r_i]\) 是其转移区间,则有 \(l_i\le l_j,r_i\le r_j\)。显然。
  • 在最优解中,一定不存在一层中的两个点 \(i,j(i<j)\),使得它们在下一层的转移点 \(i',j'\) 满足 \(i'>j'\)。这是因为可以交换 \(i',j'\) 以满足条件。这使得我们可以贪心的找编号最小的上升子序列。
  • 将所有没用的点删掉后,每一层的第一个点们一定可以构成一个上升子序列。因为每个数都是有用的所以显然。
  • 删点的顺序一定是从前往后删。因为每个数都是有用的所以显然。

暴力实现找序列、删点的复杂度是 \(O(n^2\log n)\) 的(因为需要在删掉的序列上重求 LIS 之类的数据),考虑优化。你发现一个点会被删除只可能是被选中了或没用了,而没用了只有两种情况:上一层没有匹配了或下一层没有匹配了。由于一定是从前往后删,所以这相当于匹配的右端点被删掉后立刻删除该点。将这样的关系建图,那么由于每个点只会被删一次,所以删点的复杂度是线性的,也不需要重新求 LIS。找右端点可以双指针,也可以直接二分。瓶颈在于 LIS,复杂度 \(O(n\log n)\)

代码源省选 Day12 B

两个做法:都要首先枚举答案,一个做法是用总方案数减掉枚举的答案不在虚树内的方案数(即选的点在一棵子树内)求恰好为答案的方案,另一个做法是容斥,将 \([=x]\) 转化为 \([\le x]-[\le x-1]\),原题转化为 \(([\le x]-[\le x-1])([\le x]-[\le x-1])\),转而求第一棵树编号 \(\le a\) 第二棵树编号 \(\le b\) 的方案数。都是 2 的两棵树点集的并集 次方 -1。复杂度 \(O(n^2)\)

考虑优化,第一种做法你发现总方案数和钦定一个全在子树内是直接二维数点,然后两个全在子树内不太好做,树剖一下,对于重儿子还是二维数点,若两个都是轻儿子则预处理第一棵树的轻儿子所属子树根,枚举第二棵树所有轻儿子算贡献。第二种做法你发现这个过程相当于加入一个点然后合并与其相邻的连通块,使用启发式合并维护,将每个点用一个 pair 表示(在两棵树中都属于哪个连通块),然后将 pair 用哈希表存储,每次合并只会改变 pair 的其中一项。复杂度都是 \(O(n\log n)\)

QOJ970 Best Subsequence

先考虑二分 \(W\),我们现在要求相邻的数之和 \(\le W\) 的最大数量。观察到所有 \(\le \frac{W}{2}\) 的数必须被选,否则要么不是最优解要么可以通过调整使其被选。并且,每一对相邻的 \(\frac{W}{2}\) 中至多选一个数,且这个数必然是区间最小值,并且一旦一个数出现,那么之后的最优解它都不会被删除。所以处理出 \(tim_i\) 表示第 \(i\) 个元素产生贡献的最小时刻,初始是 \(2a_i\),一个数与其前驱后继也可以更新区间最小值位置的 \(tim\),这个时刻显然是 \(a_p+\max(a_i,a_j)\)。由于需要在线查询,用主席树维护这个东西,一个实现细节是直接以下标为版本维护每个时刻的和需要区间加,虽然能做但这并不好;我们可以将版本和信息对调,这样由于是后缀加,所以只需要维护单点加和区间查了(线段树的区间查显然要比区间加好写)。我们找到 \([l,r]\) 内最左侧和最右侧的满足 \(a_i\le \frac{W}{2}\) 的点 \([L,R]\),然后查询 \([L,R]\) 内的所有点贡献,由于 \(L,R\) 本身的性质,所以不会出现跨区间贡献的情况(即贡献区间满足 \(l<L\le r\)\(l\le R<r\))。然后由于是环形,所以再考虑 \([l,L)\cup(R,r]\) 的最小值看看是否 \(\le g-\max(a_L,a_R)\)。复杂度 \(O(n\log^2n)\),可以做到单 log 但我不会。

CF1773L Lisa's Sequences

发现两个性质:一定不会存在两个相邻的位置都被操作(否则调整做到更优),一定存在一种方式使得被操作的数都被修改为极大值或极小值(因为不可能操作旁边两个数之间的数,而操作成旁边两个数之外的数不如操作成极值)。

首先能写出一个 \(O(n^3)\) 的 dp,设 \(f_{i,j,k,0/1/2}\) 表示前 \(i\) 个点最长单调序列长度为 \(j\),最长相等序列长度为 \(k\),递增还是递减还是全相等的最小代价,转移瞎分讨若干下即可。你注意到状态 \(k\) 没必要记录,把他压进值里当成第二关键字也是对的,这是因为若操作次数严格小那么若 \(k\) 太大就操作一次把 \(k\) 变为 0 即可,复杂度 \(O(n^2)\)。同理你再次发现状态 \(j\) 也可以扔掉,原因同理,若 \(j\) 太大就操作一次把 \(j\) 变为 2 即可。而 \(j\) 优先级比 \(k\) 大,因为 \(j\)\(k\) 一定不会小(感性理解)。构造是平凡的,复杂度 \(O(n)\)

posted @ 2025-12-17 16:27  dcytrl  阅读(7)  评论(0)    收藏  举报