「 solution set」 春日纪行
因为是春天到来时写的题,所以就叫春日纪行啦。
但是这首歌我有点想不起来调子的说。
会省选前陆陆续续地更完的
P5284 [十二省联考 2019] 字符串问题
首先,我们考虑暴力建图。
我们考虑对所有的 \(A\) 类串连向自己的 \(B\) 类串。然后所有的 \(B\) 类串都连向别的 \(A\) 类串满足是他的前缀。然后令所有 \(A\) 类串的点权是 \(1\),\(B\) 类串的点权是 \(0\)。
这样如果出环了就是 \(-1\)。然后跑一边拓扑就行。
然后我们考虑优化这个建图。
我们能想到建一棵后缀树。后缀树有一个性质就是树上一个节点表示的字符串一定是所有子树表示的子串的前缀。这样我们让所有给出的子串都找到对应节点,然后让 \(A\) 类点挂在树上,\(B\) 类点挂在连向所在节点,这就相当于让 \(B\) 连向所有合法的 \(A\) 了。
找到子串对应的节点是容易的。就在 \(SAM\) 上记录一下最后位置,然后倍增向上跳到合法位置即可。
我们发现这样做是不对的。因为同一个节点上所有点没有区别,所以不能判断 \(B\) 是否能向所有这个节点的点连边。我们需要对这个点内部进行拆点。我们对同一节点上所有子串按长度排序,同一长度 \(A\) 在后面。然后倒序枚举。如果现在是 \(A\) 类串,那么直接由虚点连到自己就行,如果是 \(B\) 类点,那么直接由自己连向虚点,并且新建一个虚点,连向原来的虚点。这样就能保证同一节点内的是正确的。
然后就没了。但是写了一晚上加一下午。代码能力缺乏是这样的。
[IOI2018] werewolf 狼人
我认为做这道题是需要一首 bgm 的。
IA 小天使真可爱
我们考虑从两头开始随便走,如果能走到的点是存在交集的,就说明是能走到的。现在考虑怎么求。
我们复习 Kruskal 重构树。
Kruskal 重构树有一个重要的性质。\(x\) 和 \(y\) 的 \(lca\) 的点权就是 \(x\) 到 \(y\) 的所有简单路径的最大边权的最小值。
那么我们按照最小值为边权建一棵按边权从大到小的重构树,再建一棵以较大值为边权的按边权从小到大的重构树。这样我们从起点开始,不停地跳父亲,跳到最高的点使得点权大于等于 \(L\)。对于终点也是这样跳。这样跳到的位置的子树内所有点都是从起点或终点能直接走到的位置。我们考虑怎样对这两部分求交。
我们发现每个点都有两个 dfn 值,每次找到的都对应一段 dfn 的范围。也就是对于每个询问都有两个范围,求都满足的个数。这显然是个二维偏序。
[ABC279G] At Most 2 Colors
喵喵我不会的 DP。
我们设 \(f_i\) 表示前 \(i\) 个格子被染完的方案数。
我们考虑两种情况:一种是前 \(k-1\) 个格子有两种颜色,那么当前格子只有两种选择。另外一种情况就是前面 \(k-1\) 个格子只有一种颜色,那么最后一个格子随便填。
考虑第二种情况:就是 \(i-k+1\) 位置上的颜色限制了后面 \(k-1\) 个格子的颜色全相同。那么此时的方案数就是 \(f_{i-k+1}\times C\)。
第一种情况首先要减掉第一种,然后这样前 \(k-1\) 个格子一定是两种颜色,也就是 \(2\times(f_{i-1}-f_{i-k+1})\)。
合并一下就是 \(f_i=2f_{i-1}+(C-2)f_{i-k+1}\)。
然后考虑前 \(k\) 个 \(f\) 的初值。其实就是 \(2^i\times \dbinom C 2 -C(C-2)\)
答案就是 \(f_n\)。
[ABC279Ex] Sum of Prod of Min
我们假设 \(F_k(x)\) 表示在位置 \(k\) 上的生成函数。
\(F_k(x)=\sum_\limits{i=0}^{\infty} \min(t,i)x^i\)。
\(=\sum\limits_{i=0}^{t-1}ix^i+\sum\limits_{i=t}^{\infty} \frac {x(1-x^t)}{(1-x)^2}\)
(这一步就是拿等比数列暴力合并,题解大佬都是妙妙求导但我不会/kk)
\(ans=\prod\limits_{i=1}^n F_{i}(x)\)
\(=\prod\limits_{i=1}^n\frac {x(1-x^i)}{(1-x)^2}\)
\(=(1-x)^{-2n}x^n\prod \limits_{i=1}^n (1-x^i)\)
这里涉及到一个小知识
五边形数定理:
\(\prod\limits_{i=1}^n (1-x^i) =\sum\limits_{i=0}(-1)^ix^{\frac {i(3i\pm 1)}{2}}\)
证明:不会。(
欧拉本人在过了十年之后才证明出来)
然后继续化简:
由于我们想要求次数为 \(m\) 的项,并且前面有个比较烦的 \(x^n\),所以我们干脆转化为求次数为 \(m-n\) 的项。
\(=[x^{m-n}]\sum\limits_{i=0} \dbinom{i+2n-1}{i} x^i \sum\limits_{j=0}^{\infty} f(j)x^{a(j)}\)
我们假设 \(f(i),a(i)\) 为五边形定理的系数和指数。
这里还用到一个知识点
上指标反转:\(\dbinom r k=\dbinom {k-r-1}{k}(-1)^k\)
证明:
\(\dbinom r k=\frac {r^{\underline{k}}}{k!}=\frac {r(r-1)\dots (r-k+1)}{k!}=(-1)^k \dbinom{k-r-1}{k}\)
我怎么才想起来我在情侣那个题用过这个
然后直接找指数为 \(m-n\) 的项。
\(=\sum\limits_{j=0}^{\infty} f(j) \dbinom{m-n-a(j)+2n-1}{m-n-a(j)}\)
这个就可以做啦。
P8058 [BalkanOI2003] Farey 序列
有趣的缝合怪感觉。
首先一个妙妙知识点:link
这个树有一个妙妙性质:能够表示所有的有理数,树上所有的点都是真分数,且中序遍历就是按大小排序的。
证明完全不懂。
这样,我们可以考虑在这棵树上二分答案,像线段树上二分一样。
我们考虑二分答案怎么验证正确性。
那么就是计算符合条件且比这个数小的数个数。
\(=\sum\limits_{i=1}^n \sum\limits_{j=i}^n [\gcd(i,j)==1][\frac i j<\frac x y]\)
\(=\sum\limits _{j=1}^{n} \sum\limits _{i=1}^j \sum\limits _{t|\gcd(i,j)} \mu(t) [i<\frac {jx} y]\)
\(=\sum\limits _{t=1} \mu(t)\sum\limits_{j=1} ^{\lfloor \frac n t \rfloor} \sum\limits_{i=1}^j [i<\frac {jx}{y}]\)
\(=\sum\limits _{t=1} \mu(t)\sum\limits_{j=1} ^{\lfloor \frac n t \rfloor} \lfloor \frac {jx-1}{y}\rfloor\)
然后右边是个类欧的式子,左边是个整除分块(可以用杜教筛)
然后还有一个问题是这样线段树上二分最多还是有可能走 \(O(n)\) 步,我们想让他更快()
我们发现可以二分步长。这样最卡的一定是走一步拐一步,而这样最多像斐波那契一样走 \(\log\) 步。所以复杂度是 \(O(\sqrt n \log^3)\)(接近 \(O(n)\))
P3643 [APIO2016] 划艇
\(10 pts\) :\(f[i][0/1]\) 表示考虑了 \(i\) 所学校,它出不出人的方案数。
\(20pts\) :\(f[i][j]\) 表示前 \(i\) 所学校,这所学校出了 \(j\) 个人的方案数。转移需要前缀和优化。
\(30pts\) : 我们考虑优化上面的式子。
我们不会优化上面的式子,因为第二维不能通过设状态优化掉。这个 \(1e9\) 级的东西一直存在。
我们考虑把所有的断点找到。
发现只有 \(O(n)\) 个左右的断点。断点中间的距离可能非常大。
我们重新定义状态。\(f[i][j]\) 表示前 \(i\) 个学校,第 \(i\) 所学校去取的数量落在第 \(j\) 个区间内。 我们考虑转移。我们枚举转移点 \(k\),并且要求 \(k\) 学校必须取且在 \(j\) 之前的区间取到,并且 \(k\) 之后的学校要么不取,要么取在 \(j\) 区间内。
那么在 \(k\) 之前的学校的方案数已经包含在 \(f[k][x]\) 里了(\(x\) 表示 \(k\) 可能在的区间),我们只需要考虑 \(k\) 之后的学校怎么取就行。
我们 \(k\) 之后且与 \(j\) 区间无交的学校扔掉。设现在有 \(m\) 个学校可以取,那么问题抽象成长度为 \(len\) 的区间要么取,要么不取,取的序列必须递增的方案数。这个就是 \(\dbinom {m+len}{ m}\),就是在区间前面放 \(m\) 个 \(0\),假设取到 \(0\) 了就代表不取。然而我们要求 \(i\) 这个点必须取,所以应该是 \(\dbinom{m+len-1}{m}\)
组合数要在枚举区间时预处理。
复杂度为 \(O(n^4)\)
\(40pts\) :维护个前缀和即可优化到 \(O(n^3)\)。
P7907 [Ynoi2005] rmscne
我们考虑离线查询。按照右端点排序。考虑先找左端点的位置。左端点一定是要在区间内部的,还有左端点到右端点之间一定要包含 \(l\sim r\) 的所有颜色,我们需要找到最靠右的位置 \(lst\)。
至于找这个东西,我们还是在做离线询问的过程中,在加入新点时,上一个颜色和他相同的位置 \(pre\),就不需要在 \(lst\) 里面了。我们可以维护一个并查集,并查集的最高祖宗就是最远可以取到的位置。每加入一个点,就把它连向 \(pre+1\)。查询就直接寻找 \(l\) 的最高祖宗就行。
现在我们知道了左端点可以取的范围,但是我们还是什么都不知道。
因为我们是扫描线,所以我们可以对每一个左端点 \(l\) 找到最近的 \(r\) 表示这个区间里包括 \(l\) 到 \(i\) (当前扫描线的位置)的所有颜色。找这个东西相对容易。我们考虑 radio trick,假如扫描线向右移一位。如果是一个从未见过的元素,那么所有左端点的 \(r\) 必须包括到这里。而如果之前出现过的话,那么 \(pre\) 之前的 \(l\) 的右端点就不用包括到这里了(因为他们在 \(pre\) 加进来的时候已经包括到这种颜色了)。我们用线段树维护每个左端点可以包括的右端点的最近位置,然后在合法的左端点区间查询即可。
P8368 [LNOI2022] 串
\(40\%\) 我们需要观察到性质:这个序列从后往前看,那么大概率是 \(S[i,j]->S[i-1,j-2]\) 这样的。如果走最优的情况,那么答案至少是的\(\lfloor\frac n 2\rfloor\) 。这种比较烦的是我们如果末尾的串比较长,那这个串还没减到 \(1\) 就动不了了。如果比这个还要多的话,一定是在中间跳到了后面的一个相同子串上,这样就有足够的富余能让串走到 \(1\)。
所以我们把所有本质子串都找出来,然后由长的向短的连边,由于长度一定递减所以连不出环,因此是个 DAG。然后在 DAG 上找一个最长的路径就行。
\(100\%\) :自己画画就会发现,无论在哪里走到了相同子串的前面的那个,最后一定能把这个串的长度耗没。所以我们可以找一个出现次数不少于 \(2\) 的子串,以最右边的那个位置开始,无论有多长都一定能走完。但是这不一定最优,因为最右边的串的右边那部分被浪费掉了。加上那部分的贡献,答案就是 \(r-l+1+\lfloor\frac {n-r}{2}\rfloor\)
就是维护每个出现次数大于等于 \(2\) 的串的 \(len\) 和最右端点的位置,这个 SAM 随便搞搞就行。SA 应该也是随便搞搞就行。
P4022 [CTSC2012]熟悉的文章
首先一个显而易见的 DP。
\(f_{i}\) 表示到 \(i\) 为止的最大价值。
\(f_{i} =\max\{f_{j}+i-j,f_{i-1}\}([i,j]\in S)\)
二分一下 \(L\) 就行
然后我们观察到可以取 \(j\) 的位置单调不降。(显然的字符串套路但我不会/kk)
这样我们可以用单调队列维护。
\(i\) 最远能取到的 \(j\) 显然可以 SAM 维护
P5769 [JSOI2016]飞机调度
我觉得网络流我还是太弱啦.
我们考虑给每条航线分配一个飞机,然后考虑怎样尽可能多的复用飞机。
那么我们对每条航线都拆点。假如一条航线飞完之后能直接飞下一条,我们就把左边连向右边。那么这条航线的最大流就是能复用的飞机架数。
然后需要跑一遍 floyd 来确定能不能复用。
P5251 [LnOI2019]第二代图灵机
我们看到随机生成数据,看到区间推平,然后联想到珂朵莉树。
操作 \(1\) 就整个数据结构就行。
操作 \(2\) 就珂朵莉树区间推平。
操作 \(3,4\) 就把对应区间全都拿出来,然后双指针随便做做就行。
然后就没了。
P8352 [SDOI/SXOI2022] 小 N 的独立集
比较显然的暴力就是枚举每个点的权值,设 \(f_{i,0/1}\) 表示 \(i\) 的子树内,\(i\) 选或不选的最大独立集。
然后我们考虑 DP 套 DP 这种玄妙科技。
\(g_{i,j,k}\) 表示 \(i\) 子树,\(f_{i,0}\) 为 \(j\),\(f_{i,1}\) 为 \(k\)的方案数。
然后转移方程就是 \(g_{p,j+\max(x,y),k+x}<-g_{v,x,y}\times g_{p,j,k}\)。
这样复杂度是 \(O(n^4)\)?我不会分析喵。
然后我们考虑另外一种计算独立集的办法。\(f_{i,0/1}\) 表示这个点是否强制选的最大值。
这样有一个好处就是 \(f_{i,0}\) 不会比 \(f_{i,1}\) 大超过一个点的值域。
还是像上面一样转移,不过第三维设成 \(f_{i,0}\) 比 \(f_{i,1}\) 大多少即可。

浙公网安备 33010602011771号