做题笔记21
10.23
摆完了,除了模拟赛就是幽默题,今天一共做了一个有难度的题
模拟赛
太失败了,没开 T4
T1
考虑当区间足够大的时候,很有可能所有的数都能被凑出来,这个区间长度的 \(B\) 期望为 \(\sqrt[4]{P}\)
现在提出 \(\mathcal{O}(nB)\) 的做法,考虑 meet in the middle,记 \(lst_{v}\) 为满足 \(a_{i}\times a_{j}=v\wedge i\le j\) 的最小的 \(i\),扫一遍即可
T2
这是一个闭合回路,所以可以设一个零势能点,不妨令 \(a_1=0\),对于 \(i>1\),有 \(a_{i}=a_{i-1}+w_{i}\),那么我们每次操作可以变为给 \(c_i\) 加一并给 \(c_j\) 减一,其代价为 \(a_i-a_j\),于是问题就变成求 \(\sum c_i\times a_i\) 的最大值,满足 \(\sum c_i=0,c_i\in[-x,x]\),发现 \(a\) 的顺序无关紧要,于是可以排序,贪心的选择前半的系数为 \(-x\),后半的系数为 \(x\),不难发现此时如何调整都不优,复杂度线性对数
T3
武帝了。
记 \(h(x)=\sum_{i,j}\frac{a_ia_jx^{c_i+c_j}}{c_i+c_j}\),那么 \(f(a)\) 就是 \(h\left(\frac{2}{3}\right)+h\left(\frac{1}{3}\right)+h(1)\),我们能够说明,\(f(a)=0\) 当且仅当对于所有的 \(v\),都有 \(\sum [c_i=v]a_i=0\)
如何推到?你发现 \(h\) 下面那个分母实在是太几把丑了,而你 \(x\) 指数上又有 \(c_{i}+c_j\),这启发我们直接求导,可以得到
你发现对于 \(x>0\),有 \(h'(x)\ge 0\),当 \(x=0\) 时,有 \(h(x)=0\),所以有 \(h(x)\ge 0\),那么为了使得 \(h\left(\frac{2}{3}\right)+h\left(\frac{1}{3}\right)+h(1)=0\),必须要满足 \(h\left(\frac{2}{3}\right),h\left(\frac{1}{3}\right),h(1)\) 全都是 \(0\),此时你也要满足 \(h'(x)=0\),所以能得到
那么现在就是 \(c_i=1\) 的问题,即求 \(\sum t_id_i=S,t_i\ge 0\) 的整数解的个数,由于 \(n\) 和 \(d_i\) 都很小,考虑一个经典的背包转数位 dp,记 \(D=\max d_i\)
从低到高考虑,记 \(f_{w,v}\) 为考虑了前 \(w\) 位,进位为 \(v\) 的方案,这样可以做到 \(\mathcal{O}(qn^2D\log S)\)
考虑 meet in the middle,记 \(f_{S,v}\) 为前 \(B\) 位为 \(S\),进位为 \(v\) 的方案,询问的时候再合并就可以了,总复杂度 \(\mathcal{O}(n^2D\sqrt S+qnD)\)
T4
求所有层中的括号匹配,我们发现如果 \(u<v<w\) 且 \(w\) 在两层中分别和 \(u,v\) 匹配,那么让 \(w\) 在这两层中只与 \(u,v\) 中更低的那一个匹配是不劣的,于是就能转化成一个匹配问题,给你一些 \(x\),后面的可以向前面匹配,其贡献为后面的 \(x\) 减掉前面的 \(x\) 的二倍,问最大权任意匹配
考虑费用流建模:
- \(S\rightarrow i,(1,2x_i)\)
- \(i\rightarrow i-1,(+\infty,0)\)
- \(i\rightarrow T,(1,-2x_i)\)
我们要求出最大费用任意流,考虑把他转化成最大费用最大流,也就是让费用非负,发现我们可以把所有没流满的 \(i\) 都流了 \(S\rightarrow i\rightarrow T\),这样不影响答案,这时候所有的 \(i\rightarrow T\) 都流满了,于是我们可以重新建模
- \(S\rightarrow i,(2,2x_i)\)
- \(i\rightarrow i-1,(+\infty,0)\)
- \(i\rightarrow T,(1,0)\)
最后再把费用减去 \(\sum 2x_i\)
现在考虑怎么求这个的最大费用最大流,我们可以先求出任意一组最大流,然后在上面找环,而在这个图中,所有正权环只可能是 \(S\rightarrow S\),所以我们需要找到若干 \(S\rightarrow u\rightarrow v\rightarrow S\) 的环,然后加上他们的贡献
现在考虑 \(u\) 的权值被调大的影响,另一种情况是对称的,这时候肯定是 \(u\) 流的不比之前少不劣,我们这时候会试图找一个 \(v\),然后跑 \(S\rightarrow u\rightarrow v\rightarrow S\) 的环,其贡献就是 \(x_u-x_v\),于是我们要找的就是 \(x_v\) 最小的,且至少流过 \(1\) 的流量,在 \(i\leftrightarrow i-1\) 的那些边上能够从 \(u\) 到达的 \(v\),由于 \(i\rightarrow i-1\) 流量为正无穷,所以 \(<u\) 的位置都能到,而 \(>u\) 的位置,必须满足 \((u,v)\) 中所有 \(i\rightarrow i-1\) 的反向边的流量不为 \(0\),于是可行的 \(v\) 是一个前缀,这个前缀可以线段树上二分找到,然后做区间查询,可以简单维护
复杂度线性对数
P14231 复读机 / repeat
qoj 970,没想到还能单 log
将问题转为数点,每一个贡献都是形如 \((l,r,i,j)\) 表示在 \(v\in[l,r]\) 的时候 \(i,j\) 为相邻的一类数,并且有 \(1\) 的贡献,可以差分变成单点加矩形和,直接二分即可
发现对于一个时刻 \(v\),仍有贡献的四元组 \((l,r,i,j)\),其中所有的区间 \([i,j]\) 除端点外不相交,那么数点就可以降一位,只要求 \(i\) 在区间内,此时只会多算包含右端点的一个贡献区间
查前驱后继可以在整体二分的时候双指针
复杂度线性对数
P14230 不连续子串 / subseq
记 \(f_i\) 为 \(i\) 为 \(q\) 中末尾的方案,考虑从 \(j\) 转移到 \(i\),则应该满足
- \(\forall k\in(j,i),a_k=a_i\),\(k\) 不在 \(p\) 中
- 令 \(l=\max_{k\in(j,i),a_k=a_i} k\),必须存在 \(x\in(l,i)\) 在 \(p\) 中
- 对于 \(p\) 中的相邻两个数 \(u,v\),满足 \(\not\exists k\in(u,v),a_k\ne a_v\)
复杂度平方
P14188 [ICPC 2024 Hangzhou R] Barkley III
哈哈。
P14194 [ICPC 2024 Hangzhou R] Heavy-light Decomposition
我场切了绿题,真是太厉害了呢!
P13976 数列分块入门 1~9
很无聊
P14177 【MX-X23-T7】我爱数数
爱慕爱嗯爱慕爱艾克斯容斥,此时对于所有的操作,你会有一个限制,你每次只能操作那些没有被限制到的区间,假如区间有 \(k\) 个,这样概率是 \(\sum_{i=0}^{\infty}\left(\frac{k}{m}\right)^i=\frac{m}{m-k}\)
所以考虑找出来区间最小值,做区间 dp,区间最小值左右都是独立的,于是可以直接 dp,容易做到复杂度 \(\mathcal{O}(m^3n^2)\),转移形如一个背包,把那一位用点值表示就能做到 \(\mathcal{O}(m^3n)\)
P14176 【MX-X23-T6】网格 III
考虑 \((i,j)\) 到 \((i+k-1,j+k-1)\),如果是红的,要么横竖当前都是红色,要么横着的当前全是红色,且竖着的白色最晚的出现时刻小于横着的红色的最早出现时刻,容易用线段树维护,复杂度 \(\mathcal{O}(nk\log n)\)
P6982 [NEERC 2015] Jump
先问全 \(1\),然后从左到右一个一个翻,这样肯定有一个时刻能问出来 \(\frac{n}{2}\)
然后对于相邻的两位,归为一组,每组翻转了问一下,这样能判断是全问对了还是只问对了一个,全问对了好说,只问对了一个的可以找一个已知的再问一下,如果全是只问对了一个,可以把其中的两组 \(12\) 和 \(34\) 拉出来,问一下 \(23\) 看是全问对了还是只问对了一个,如果只问对了一个,再问一下 \(13\) 就行了
这样找一个 \(\frac{n}{2}\) 要 \(n\) 次操作,问出来正确的串也要 \(n\) 次操作,总操作次数 \(2n\),这直接爆了
考虑最开始的时候随机问,正确的概率是 \(\frac{\binom{n}{\frac{n}{2}}}{2^n}\),问个五百次就差不多了
10.24
补了昨天的 T4,并没有想象中这么难
今天仍然是摆完了,做了很多幽默题
如此状态,如何 CSP?
P6276 [USACO20OPEN] Exercise P
求的实际上就是所有排列置换环长度的 \(\text{lcm}\),我们可以参考 \(\min-\max\) 容斥做 \(\gcd-\text{lcm}\) 容斥,即
考虑钦定 \(d|gcd\) 做容斥,记 \(f_{i}\) 为把 \(i\) 个数划分到若干个环上的答案,每次枚举第一个元素的环长,则有转移
我们还要记一个 \(g_i\) 表示把环上 \(id\) 个数划分到若干个长度是 \(d\) 的倍数的环上的答案,这个要带上容斥系数,则有转移
那么钦定 \(d|gcd\) 的答案就是 \(\sum_{i=1}^{\frac{n}{i}}g_i\times f_{n-id}\times\binom{n}{id}\)
直接做复杂度就是 \(\mathcal{O}(n^2)\)
\[\int_{1}^{n}\frac{1}{x^2}\mathrm{d}x=1-\frac{1}{n} \]
P11816 [PA 2019 Final] 摆棋 / Pionki/#1250. Tokens / Pionki
问题是一个最大匹配的判定,考虑霍尔定理,如果选了左部点 \((i,j,k)\),那么其邻域会加上 \(\sum_{a\le i,b\le j,c\le k}b_{i,j,k}\),那么被 \((i,j,k)\) 偏序的左部点肯定也会都选上,最后要求的就相当于一个最大全闭合子图
\(B,C\) 很小,考虑状压,发现每一层的状态其实都是一个折线,于是可以轮廓线 dp 转移,复杂度 \(\mathcal{O}\left(A(B+C)\binom{B+C}{B}\right)\)
P5999 [CEOI 2016] kangaroo
连续段 dp,每次加一个数,若 \(i\ne s/t\),可以新开一个段或者合并两个段,否则只能放在首/尾
容斥确实能做
P9675 [ICPC 2022 Jinan R] Shortest Path
太强了
考虑最终路径大概是走了 \(\mathcal{O}(n)\) 步,然后在一条边上反复横跳,然后再走 \(\mathcal{O}(n)\) 步到达 \(n\),而且我们可以说明当 \(k>4n\) 时结论一定成立
对于一条最短路径,我们取出来他的最小边 \(e\),观察到如果一个环长度为偶数,我们可以把这个环替换成若干边 \(e\),而如果全是奇环,有两个我们也可以把他替换掉,所以考虑鸽巢原理,对于任意一条点数 \(>2n\) 的最短路径,至少存在某一个点 \(x\),在这条路径上出现了三次,这三次会形成至少两个环,于是我们只需要分讨这个两个环的奇偶性就能消环了,这样会一直消环直到点数 \(\le 2n\),所以结论得证
于是预处理出来 \(f(u)\) 表示 \(1\rightarrow u\rightarrow n\),走了 \(4n+1\) 步的答案,\(g(u)\) 表示 \(1\rightarrow u\rightarrow n\),走了 \(4n\) 步的答案对于,那么最终答案的形式是一个半平面交,我们可以求出来凸包再等差数列求和,复杂度 \(\mathcal{O}(nm)\)
P8916 [DMOI-R2] 暗号
考虑把贡献拆到每个点上,其贡献只和到根链上的黑色连续段数有关,所以可以直接存到状态里,从下往上 dp 即可,复杂度 \(\mathcal{O}(n^3)\)
P6072 『MdOI R1』Path
考虑淀粉质,可以做到三个老哥
发现淀粉质太唐了,考虑对于每个点,分别求出其子树内的最大值和子树外的最大值,前者可以启发式合并做到 \(\mathcal{O}(n\log n\log V)\),后者考虑拉出来全局最大的路径,于是只需要求这条路径上的答案,正着倒着分别扫一遍即可,复杂度 \(\mathcal{O}(n\log V)\)
总复杂度 \(\mathcal{O}(n\log n\log V)\)
你发现这个子树内最大值太唐了,因为我们只需要对最大的链上的点求子树内最大值,这个启发式合并就不用对每个点都做一遍了,只需要把最大的链上的相邻点合并就行了
复杂度线性对数
P14250 [集训队互测 2025] 携春同行
为啥是黑来着
自然的想法是问菊花,我们把 \(a_i\) 最大的叫做 \(A\),次大的叫做 \(B\),第三大的叫做 \(C\),你发现你问出来的每个结果都形如 \(A+B+x\),而且你考虑最大的、次大的、第三大的,他们三个问出来肯定都是 \(A+B+C\),这样用了 \(n\) 次就知道了很多信息,但是题目说 \(n+1\) 次,所以你可以再问一次链,得到 \(\sum a_i\) 的值,这样你就能解出来 \(C\) 的值,从而能得到 \(A+B\) 的值,进而能得到所有的非最大、次大的值
现在考虑一般的情况,这时候你的 \(A+B+C\) 可能不止三个,而题目要求出 \(n-2\) 个数,那就别管最大次大了,考虑如何求出所有的 \(C\),要求次数是 \(\log\) 级别的,于是考虑二分,把可能等于 \(C\) 的一半拿出来,构造一个链,其他的点放成一条,然后你把拿出来的点放在中间,这样你就能问出来你拿出来的点中是否存在不是 \(C\) 的点,这样你二分两次就行了,询问次数 \(2\log_2n\le 20\),随便过
感觉训了这么长时间,唯一提升的是交互水平
P14252 [集训队互测 2025] 集你太美
在最终情况下,所有点都会被操作无穷次,因为肯定存在某一个点操作了无穷次,其相邻点就不可能操作有限次
假如 \(i\) 第一次操作在 \(i+1\) 之前 ,那么一定有 \(w_i\ge\sum_{j=1}^{i=1}e(i,j)\)
所以对于操作序列 \(1,2,\cdots ,n\),我们可以操作一次之后将 \(n\) 放在开头,你发现此时仍然合法,于是上述条件是充要的
于是 \(\sum_{i=1}^{n} w_i\) 的下界是所有边的权值之和,并且可以将图定向为一个 \(DAG\) 之后,给每个点赋权值为其所有入边的权值之和来构造 \(o=1\)
对于 \(o=2\),随便定向,观察定向后任意一个出度为 \(0\) 的点 \(u\),该点显然满足 \(w_u\ge \sum_{(u,v,x)\in E}x\),将 \(u\) 删掉递归判定即可,最终 \(G\) 被删空则有解,否则无解
CF2129E Induced Subgraph Queries
看起来根本就不能 polylog,于是考虑根号数据结构,发现每个点的操作代价是 \(\mathcal{O}(deg)\) 的,这太难受了,于是可以拆点,每个点拆成 \(deg\) 次操作,再跑莫队复杂度就对了
对于 kth,可以用值域分块维护
总复杂度 \(\mathcal{O}((n+m)\sqrt{n+m})\)
CF2115E Gellyfish and Mayflower
考虑一条路径上性价比最大的 \((c,w)\),感性理解一下,当选了一些数之后就只会再选性价比最大的了,因为考虑在膜 \(c\) 意义下,如果同一个余数出现了两次,那么不如把那一段路径的其他点直接选若干个 \(c\),这样肯定是更优的,为了不让一个余数出现两次,背包大小只需要开到 \(c^2\)
于是考虑同余最长路,记 \(f_{s,u,r,0/1}\) 表示性价比最大的为 \(s\),当前在 \(u\),膜 \(c\) 余 \(r\) 的答案,最后只需要查询 \(\max_s f_{s,u,r\bmod c_{s},1}+\left\lfloor\frac{r}{c_s}\right\rfloor\times w_s\)
转移的话,单点之间的转移可以转圈,这样转移复杂度是线性的,不同点之间的转移,边权为 \(w_i-\left\lfloor\frac{r+c_i}{c_s}\right\rfloor\times w_s\)
所以当询问的 \(r\) \(>c^2\) 时,我们跑这个算法,对于 \(r\) 比较小的情况,我们跑 \(\mathcal{O}(n(n+m)c)\) 的暴力,所以总复杂度 \(\mathcal{O}(nq+(n+m)(n+c)c)\)
CF2122F Colorful Polygon
没想到组合数乘积,太失败了
如果能表示成组合数乘积,我们就可以变成几个高度为 \(2\) 的矩形,然后在上边放 \(n+1\) 个点,下面放 \(m+1\) 个点,这样就是 \(\binom{n+m}{n}\)
容易把两个矩形拼起来,变成乘积,那么考虑最简单的方案就是 \(\prod_{i=1}^{n}\binom{\sum_{j=1}^{i}a_j}{a_i}\),然而这样点数是 \(\mathcal{O}(n\sum a_i)\) 的,考虑分治,把集合 \(S\) 对应的多项式系数表示成 \(f(S)\),则把他分成两个集合 \(U\) 和 \(V\),可以得到 \(f(S)=\binom{s(U)+s(V)}{s(V)}f(U)f(V)\),其中 \(s(U)\) 是 \(U\) 中元素的和,我们按照重量比较平衡的分法进行递归就行了,点数 \(\mathcal{O}(\log n\sum a_i)\)
CF2097E Clearing the Snowdrift
扫描值域,每次做一个问题:给你一堆 \(1\) 和一堆 \(0\),求最小长度为 \(d\) 的区间数能包含所有的 \(1\),用 LCT 维护,\(0\) 点连向 \(i+1\),\(1\) 点连向 \(\min(i+d,n+1)\),答案就是 \(1\) 到 \(n+1\) 链上权值和
复杂度线性对数
CF2096F Wonderful Impostors
双指针
对于加入 \(1\),查询其覆盖的是不是已经全是 \(0\) 了,可以线段树维护区间加,区间最值
对于加入 \(0\),查询其构成的最长的 \(0\) 连续段是否包含了一个 \(1\),也就是查询 \(r\le qr\) 的最大的 \(l\),线段树套 set 完事
复杂度 \(\mathcal{O}(n\log^2n)\)
10.25
模拟赛
T1
模拟
T2
类似括号序列 dp 就行了
T3
容斥
T4
枚举每个数的贡献,区间合法当且仅当被贡献了两次,扫描线维护区间加、区间最大值、区间最大值的权值加
10.26
P13540 [IOI 2025] 羊驼的坎坷之旅(obstacles)
太难了,只会 \(l=0,r=m-1\)
手玩一下发现路径大概都是一堆 \((0,x)\rightarrow (z,x)\rightarrow (z,y)\rightarrow(0,y)\),于是考虑 \((0,i)\) 能不能到达 \((0,j)\),记 \(pre_i\) 为 \((0,i)\) 直着往下走能走到最远的位置,记 \(T'_{r}=\max_{k=1}^{r}T_k\),记 \(H'_{l,r}=\max_{k=l}^{r}H_k\),那么 \(i\) 能到达 \(j\) 当且仅当 \(T'_{\min(pre_i,pre_j)}\ge H'_{i,j}\),于是这样就能给 \(i,j\) 连一条边,最后可以并查集判断连通性
发现很多边都没用,具体来说,如果存在 \(i<j<k\) 且 \(pre_i\le pre_j\le pre_k\),此时只需要保留 \((i,j)\) 和 \((j,k)\) 的边,于是我们只需要单调栈两边,连 \(i\) 和左边第一个 \(pre_j>pre_i\) 的 \(j\) 记作 \(L_i\),右边第一个 \(pre_j>pre_i\) 的 \(j\) 记作 \(R_i\),判断一下是否能连边就能 \(83\) 分了
既然都单调栈了,不妨在笛卡尔树上考虑,\(i\) 与 \(j\) 能互相到达,也就是 \(i\) 和 \(j\) 有能到达的公共祖先,于是考虑问出 \(i,j\) 在 \([l,r]\) 内的最浅的祖先,判断是否相同
首先一直倍增跳父亲,直到 \(x\) 的子树包含了 \(l\) 或者 \(r\),此时不能再随便跳了,但是舒服的是他只能往其中一边跳,再往后跳的过程可以直接倍增,问题是找到这个一直往一边跳之前到的祖先,如果我们找到一条极长的左偏的链 \(a_1,a_2,\cdots ,a_k\),他们之间互相能到达,且他们的 \(L\) 都是一样的,记作 \(p\),现在想要跳到 \(p\),你这时候发现,如果 \(a_i\) 能直接到达 \(p\),那么 \(a_{i+1}\) 也能直接到达 \(p\),所以如果想让 \(a_1\) 跳到 \(p\),只需要找到最小的 \(a_k\) 满足 \(a_k\) 能到达 \(p\),然后跳过去就行了
所以找到 \(x\) 的这个祖先,如果 \(x\) 和 \(L_x\) 和 \(R_x\) 都能到达,跳深度更浅的那一个,否则直接跳
复杂度线性对数
P13691 [CEOI 2025] highest
考虑倍增,普通的倍增直接爆了,于是考虑怎么让每次倍增可以决策一个两步,考虑到 \(2^i=2^{i-1}+2^{i-1}\),也可以是 \(2^{i}=(2^{i-1}-1)+(2^{i-1}-1)+2\),这样就能考虑到 \(2\) 了,再加上 \(2^{i}-1=2^{i-1}+(2^{i-1}-1)\),直接倍增即可
复杂度线性对数
P14311 【MX-S8-T4】平衡三元组
考虑如果固定中间值,左右肯定越大越好,所以肯定有一个取到全局最大值,假如 \(z\) 取到全局最大值,\(x\) 必定是 localmax,扫所有 \(x\),查一下 \(x\) 右边有没有合法的 \(y\),如果没有,则去考虑前一个 localmax,此时会除二,所以只用做 \(\mathcal{O}(\log V)\) 次,总复杂度 \(\mathcal{O}(n\log n\log V)\)
P13695 [CEOI 2025] theseus
我曹
首先给一条边赋 \(0/1\) 可以给这条边定向从编号小的或者是编号大的,跑一边 bfs 给图分层,如果所有边都是不同层了,直接连就行了,出现同层的就废了,现在考虑怎么处理同层的边
把每一层的边摘出来,从层数大的处理到层数小的,不同层的边把他归到两个点中层数更高的那一层去,对于边 \((x,y)\),以 \(x\) 为第一关键字,\(y\) 为第二关键字从大到小排序,给每个点记一个势能 \(f\),初始值都是 \(1\),依此遍历每一条边,如果不同层,让层数大的连向层数小的,否则让 \(f\) 小的连向 \(f\) 大的,把 \(f\) 小的清空,加到 \(f\) 大的上,最后你走的时候每次走出边中编号最大的即可
去掉无向边后该图变成一个有向树,势能为子树 \(siz\),每次走相同层的边都会使得势能翻倍,于是总次数 \(dis+\log n\)
P10055 [CCO 2022] Good Game
考虑把所有的连续段搞出来,长度 \(>1\) 的为一类叫做 \(2\),否则叫做 \(1\),这样显然和原来没有任何区别,有用的操作只有两种:删掉最左边或者最右边的 \(2\)、删掉中间的 \(2\),并将两边的东西合并成一个 \(2\),因为把一个 \(2\) 变成一个 \(1\) 显然更劣,\(2\) 是更加自由的
接下来对串长分奇偶讨论:
当串长为奇数,形如 \(2k+1\),我们可以说明串能被消完当且仅当串正中间是 \(1\),且存在长度至少为 \(k\) 的 \(1\) 连续段
容易说明充分性,考虑长度为 \(k\) 的那一段,左边和右边必定有两个 \(1\) 不能删掉,那就没了
否则如果正中间不是 \(1\),我们可以一直操作正中间的 \(2\) 把所有数都消了,否则考虑此时所有的 \(2\) 之间的间隔 \(< k\),我们考虑与中间的 \(1\) 相邻的两个 \(2\),观察最中间的数的变化,如果删掉一边的 \(2\),那么中间的 \(1\) 会减少一个,并且中间位置会向另一边偏,考虑最偏的情况,左边的 \(2\) 在 \(L\) 处,右边的 \(2\) 在 \(L+k\) 处,如果我们只删左边,可以删 \(L-1\) 次,那么最中间的下标在 \([k+1,L+k]\),也就是说右边的 \(2\) 肯定在某个时刻会变成最中间的数,这时候删他就行了
对于偶数的情况,最后一定会剩下 \(22\),于是合法的偶数串一定能劈成两个合法的奇数串,判断前后缀即可
构造方案是简单的,复杂度线性
P12033 [USACO25OPEN] Package Pickup P
如果确定了一个奶牛所控制的区间,其肯定是先往一边跑再掉头跑另一边,考虑 dp,记 \(f_{i,0/1/2/3}\) 表示 \(i\) 被左边还是右边经过,经过了一次还是两次,转移是矩阵乘法
可以按 \(M\) 分块,本质不同的块只有 \(\mathcal{O}(N)\) 种,我们可以把对块形态的修改挂到开头结尾,用线段树维护单点修改全局矩阵乘积,本质相同的块做矩阵快速幂即可,复杂度线性对数,会带一个大常数
10.28
真他妈无敌了,今天做题数=1,晚上看了一个题还没看懂
模拟赛
T1
幽默
T2
打表
T3
拉出极小的 mex 区间,对于 mex 相同的 mex 区间,做一个点减边,查询区间 \(\sum_{L\le l,r\le R}v_{l,r}(R-r+1)(l-L+1)\),复杂度线性对数
T4
直接看原题解吧,写在这有点太有点了
P9970 [THUPC 2024 初赛] 套娃
我们称一个区间 \([l,r]\) 为极小的 \(\text{mex}\) 区间,满足不存在 \([l',r']\subset [l,r]\),其中 \([l',r']\) 的 \(\text{mex}\) 等于 \([l,r]\) 的 \(\text{mex}\),有结论,极小的 \(\text{mex}\) 区间的个数是线性的
考虑区间 \([l,r]\),其中肯定有 \(a_l=\text{mex}\) 或者 \(a_r=\text{mex}\),且肯定有 \(a_l\ne a_r\),不妨设 \(a_l<a_r\),假如有 \([l,r]\) 是极小的 \(\text{mex}\) 区间,如果存在另一个极小的 \(\text{mex}\) 区间 \([l,r_1]\) 满足 \(a_{r_1}<a_l\),因为有 \(\text{mex}([l,r])\ge a_l>a_{r_1}\),所以 \(a_{r_1}\) 肯定在 \([l,r]\) 中出现过了,所以不可能存在这样的 \(r_1\),于是我们证明了对于所有的 \(l\) 只存在一个这样的 \(r\),同理我们能证明对于所有的 \(a_r>a_l\) 只存在一个这样的 \(l\),所以极小的 \(\text{mex}\) 区间的个数是线性的,且其个数上界为 \(2n\)
如何取出所有的区间?考虑从 \(0\sim x-1\) 的区间推出 \(x\) 的区间,首先显然,所有 \(\text{mex}=x\) 的极小的区间肯定要包含一个 \(\text{mex}< x\) 的区间,所以可以考虑从 \(x-1\) 扩展出其他的,对于 \(\text{mex}=x-1\) 的区间 \([l,r]\),我们找到其左边第一个 \(x-1\),记其位置为 \(pl\),再找到其右边第一个 \(x-1\),记其位置为 \(pr\),那么我们再在 \(\text{mex}(pl,r)\) 的位置加入 \((pl,r)\),在 \(\text{mex}(l,pr)\) 的位置加入 \((l,pr)\),一直这样做就能找到所有的区间了
回到本题,我们可以考虑找到所有极小的 \(\text{mex}\) 区间 \([l,r]\),再在其基础上左右扩展,其对应的找到极大的 \(\text{mex}\) 不变的区间 \([l',r']\),那么就能贡献到 \([r-l+1,r'-l'+1]\),用老司机树维护颜色段即可,总复杂度线性对数
10.29
模拟赛
T1
感觉比 T2 难
T2
奇异搞笑
T3
幽默
T4
\(F_{i+j}=F_{i+1}F_{j}+F_{i}F_{j-1}\)
10.30
去海边了,很好玩
10.31
嗯
11.1
太幽默了,就这样吧
11.2
刺激战场
11.3
摆烂
11.4
有两个题完全没看懂,太失败了
模拟赛
T1
800。
T2
幽默。
T3
神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!
T4
神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!神题!
AT_agc073_c [AGC073C] Product of Max of Sum of Subtree
记题目中要求的 \(x_i\) 为 \(g_i\)
如果我们知道了所有点的权值 \(w_i\),那么有 dp,\(f_u=w_u+\sum_{v\in \text{son}(u)}\max(f_v,0)\),\(g_u=f_u+\max(g_{fa}-\max(f_u,0),0)\),\(g\) 太难考虑了,我们考虑找到合法的 \(f\) 的充要条件
有一个必要条件是 \(f_1\in[0,1]\),\(\forall u>1,f_u\in [-1,1]\),首先有 \(g_1=f_1\),所以有 \(f_1\in[0,1]\),对于 \(f_u\) 的上界,有 \(g_u\ge f_u\),所以有 \(f_u\le 1\),对于 \(f_u\) 的下界,有 \(g_u=f_u+\max(g_{fa}-\max(f_u,0),0)\),其中 \(g_{fa}\le 1\),所以 \(\max(g_{fa}-\max(f_u,0),0)\le 1\),所以 \(f_u\ge -1\)
记 \(s_u=\sum_{v\in \text{son}(u)}\max(f_v,0)\),有 \(f_u=w_u+s_u\),我们发现此时有 \(0\le s_u\le|\text{son}(u)|\),所以如果我们确定了所有点的 \(f\) 值,有且仅有一组 \(w_u\in[1-N,1]\) 的方案满足当前的 \(f\)
于是只需要考虑 \(f\),跟据 \(g_u=f_u+\max(g_{fa}-\max(f_u,0),0)\) 讨论:
- 若 \(f_u\in[-1,-g_{fa})\),\(g_u=f_u+g_{fa}<0\),此时不合法
- 若 \(f_{u}\in[-g_{fa},0)\),\(g_u=f_u+g_{fa}\)
- 若 \(f_{u}\in[0,g_{fa})\),\(g_{u}=g_{fa}\)
- 若 \(f_{u}\in[g_{fa},1]\),\(g_u=f_{u}\)
于是可以 dp,记 \(F_u(x)\) 为 \(g_u=x\) 的答案,则有
也就是
直接维护多项式转移即可,复杂度 \(\mathcal{O}(n^2)\)
P11420 [清华集训 2024] 乘积的期望
首先把 \(\prod a_i\) 拆开,变成操作若干次,每次操作将所有的 \(n\) 个数划分到若干个集合中,集合总数为 \(C\),每个集合中的数相差小于 \(m\),对这样的方案求和,考虑 dp,记 \(f_{i,j,S}\) 为考虑了前 \(i\) 个数,将其划分到 \(j\) 个非空的集合中,\(S\) 中存储 \([i-m,i-1]\) 那些位置中,作为集合中的最小值且还没有最大值和其匹配的位置都有哪些,于是有这几种转移‘:
- \(i\) 既不是集合中的最大值又不是集合中的最小值
- \(i\) 是集合中的最小值
- \(i\) 是集合中的最大值,枚举和 \(S\) 中的某个最小值匹配
- \(i\) 独自一个集合
最终答案为 \(\sum_{i} f_{n,i,S}\times A(C,i)\times \left(\sum b\right)^{-i}\)
当 \(m\le 16\) 时,采用此算法可以做到 \(\mathcal{O}(n^2m2^m)\) 的复杂度,同时我们也知道,最终答案一定是关于 \(C\) 的 \(n\) 次多项式
当 \(m>16\) 时,考虑在结尾填上若干个 \(0\) 凑成 \(n=3m\)
考虑将 \(n\) 分成三组,\(1\sim m\)、\(m+1\sim 2m\)、\(2m+1\sim 3m\),对其进行计数,记 \(a_i\) 为最终 \(i\) 覆盖的次数,考虑合法 \(a\) 的充要条件
- \(\forall i\),有 \(a_i\ge 0\)
- \(\forall 1\le i\le m\),有 \(a_i+a_{i+m}+a_{i+2m}=C\)
- \(\forall 1\le i<m\),有 \(a_i\le a_{i+1}\)
- \(\forall 2m+1\le i<3m\),有 \(a_i\ge a_{i+1}\)
- \(a_{m}+a_{2m+1}\le C\)
于是直接 dp,在最外面枚举 \(a_{2m+1}\),记 \(f_{i,a,b}\) 表示考虑前 \(i\) 列,当前列上 \(i\)、\(2m+i\) 分别是 \(a\)、\(b\) 的方案,直接 dp 就能做到 \(\mathcal{O}(nC^5)\),分步转移即可去掉一个 \(C\),再拉格朗日插值就能 \(\mathcal{O}(n^6)\)
P11425 [清华集训 2024] 路南柯
结论:答案为删去叶子后得到的树的叶子个数,特别的,菊花的答案为 \(2\)
把拓扑序倒过来,就变成了 dfn 序,我们随便拉一个 dfn 序,其中对树的形态的限制只有形如点 \(i\) 的父亲的 dfn 序在点 \(i\) 之前,所以当前一个点可能有很多个父亲,我们就需要把所有点的父亲找到
考虑原树上的叶子,为了区分其父亲和祖父,一定要存在一次拓扑的起点在这个叶子的父亲的子树中,否则无论如何都无法区分其父亲和祖父,于是答案不会小于删去叶子后得到的树的叶子个数
考虑构造到这个下界,找到所有的删掉叶子后剩下的叶子 \(x_1,x_2,\cdots,x_k\),任选一个作为根跑一边 dfs,遍历时优先访问叶子节点,此时,对于点 \(u\),若其子树内存在某个点作为拓扑序的开头,\(u\) 的父亲就能被确定了,所以只需要考虑那些叶子的父亲,对于 \(x_{2},x_3,\cdots,x_k\),以他们出发进行 dfs,访问节点是优先访问 dfn 大的,这样就能找到叶子的父亲了
P11428 [清华集训 2024] 前往何方
考虑问出若干个独立集,之后可以变色龙
所有点问一遍 \(U/\left\{u\right\}\),然后可以确定重心,如果我们按这个结果排序,可以确定一个拓扑序,所以可以直接二染色,这样就两个独立集,直接变色龙就行了
P11423 [清华集训 2024] 阿尔塔尔 2
有经典结论,长度 \(\le 2\),不过我突然不会证了
取出出度最大的点 \(u\),其出度集合为 \(S\),入度集合为 \(T\),此时若长度大于 \(2\),则所有 \(T\) 中必定存在点向 \(S\) 中的点有出边,此时其度数大于 \(u\),与条件矛盾,得证
考虑随便取出一个点,若该点入度为 \(0\),那么它就是答案,答案肯定在其入点集合中,因为此时其入点集合中的点到集合外路径 \(\le 2\),而该入点集合内又满足结论,所以我们只需要在入点集合内找,那么每次随机一个点就行了,这样期望会把入点集合的大小减半,次数 \(n+\frac{n}{2}+\frac{n}{4}+\cdots=2n\)
P11421 [清华集训 2024] 最大匹配 2
暴力怎么做,从左到右扫一遍,每一个颜色维护一个栈,能肖战就肖战,把最后剩下的再做一遍匹配即可,因为肯定是留下来越靠左的左括号和越靠右的右括号越优
然后考虑单调修改,此时只有 \(\mathcal{O}(1)\) 个位置会受到影响,我们可以直接做一个人员调度,用线段树维护区间加,区间最值以及线段树上二分

浙公网安备 33010602011771号