2024.7
1.Um_nik mod 998 244 353 Contest
F.Is This FFT?
不妨令最后形成的链是 \(1-2-3-\dots -n\) ,然后令 \(p_i\) 是 \(i-{i+1}\) 被删的时间。
如果枚举了 \(p\) 形成的大根笛卡尔树,怎么算答案呢,你发现我们的限制形如,父亲要后于儿子加入;设左子树大小为 \(x\) 右子树为 \(y\) ,则有 \((x+1)(y+1)-1\) 条边必须要在这个点后面加入。连出这些限制,你发现它不考虑方向就形成了一棵树,经典的考虑容斥,等同于钦定一些非树边在对应的树边前面。
对着这个 dp ,你发现是卷积的形式,具体的就是 \(G_i(x)=\sum\limits_{j=0}^{i-1}F_j(x)F_{i-1-j}(x)(1-x)^{(j+1)(i-j)-1},[x^j]F_i(x)=\frac{1}{j}[x^j]G_i(x)\) 。
考虑每算出一个 \(F_i(x)\) 后就对其 DFT ;对于 \((1-x)^{k}\) ,将其拆成 \(k=na+b\) ,然后预处理出 \((1-x)^{na}\) 和 \((1-x)^b\) DFT 后的结果,这是 \(O(n^3\log n)\) 的;我们就容易据此算出对 G DFT 后的结果,IDFT 回去之后就能得到 G ,这是 \(O(n^4)\) 的,总复杂度即 \(O(n^4+n^3\log n)\) 。
K.4
算 K4 的个数。首先使用一种处理无向图的经典方法:将所有点按度数从小到大重标号,考虑一个点有多少大于它的与之相连,可以发现最多只有 \(\sqrt{2m}\) 个点,设这个点数是 \(d_x\) 。
于是枚举 K4 中最小的点 \(x\) ,再枚举两个与之相连的比它大的点 \(y,z\) ,其中要满足 \(y,z\) 相连,现在数有多少合法的 \(w\) ,直接 bitset 数就好了。注意到这里我们只需处理与 \(x\) 相连的 \(w\) ,这里 bitset 长度就是 \(d_x\) 的,单次求 \(w\) 个数就是 \(O(\frac{d_x}{w})\) 的;于是总算量就是 \(\frac{\sum d_i^{3}}{w}\) ,由于 \(d_i\le \sqrt{2m}\) ,\(\sum d_i\le m\) ,这个式子最大值就是 \(O(\frac{m^2}{w})\) 了。
M.5
令 \(x\) 是选的数之和-选的数个数,\(y\) 是选的数个数,就记个 \(dp_{x,y}\) 然后从左到右对每种相同的数二进制拆分之后跑背包,你观察到由于 \(1\) 有很多,所以固定 \(x\) 后可能的 \(y\) 就形成了 \(O(1)\) 个连续段。复杂度就是 \(O(n\sqrt{n})\) 的了。
H. Exact Subsequences
考虑算不同子序列个数的过程,就是从左到右扫,维护两个数 \(a,b\) 初始等于 \(0\) ,如果遇到 \(0\) 就令 \(a:=a+b+1\) ,否则 \(b:=a+b+1\) 。把 \(a,b\) 同时加 \(1\) ,发现这就变成了 \(a:=a+b,b:=a+b\) ,于是我们发现每个 01 串其实是和一对 \(gcd(a,b)=1\) 的 \((a,b)\) 一一对应的。现在问题转化成算 \(gcd(a,n)=1\) 的 \(a\) 中第 \(k\) 小的,二分容斥算一下就好了。
G.MIT
猜测出选 \(k\) 对点的最优点集是由 \(k-1\) 对点拓展而来,我们考虑怎么选这两个点最大化答案。不要拘泥于原形式,把这个最大值看成是 \(\sum dis(p_i,p_{i\bmod m+1})\) 的 max ,这样就能定义选奇数个点的最大值。考虑加入一个点 \(x\),对答案的贡献是什么,取出新的带权中心 \(rt\),那么贡献就是 \(dis(rt,x)\) 。问题是每加入一个点新的带权中心可能不一样,怎么办呢。直接用原来的带权中心充数即可。这样会算错点集大小是奇数时的答案,但偶数一定是对的。
现在相当于找剩余的点中哪个离 \(rt\) 最远,线段树维护剩余点的直径即可。怎么算新的带权中心呢?注意到这个一定在 \(rt\) 到 \(x\) 的路径上,于是取 \(1\) 到 \(rt\) 中最深的 \(2sz_f>sz_1\) 的点,\(1\) 到 \(x\) 同理,然后比哪个更深即可。复杂度 \(O(n\log^2n)\) 。
2. CF1375H Set Merging
交换一下值域和下标,我们要解决的是,对一个序列只考虑值在 \([l,r]\) 的位置的信息,从左往右加起来的结果。且这个”信息“不满足交换律,只满足结合律。
分块,对每个块将其内部值离散化后尝试算出 \(f_{l,r}\) 为:值在 \([l,r]\) 的信息加起来的结果。这个不难分治解决,有 \(T(n)=2T(n/2)+\frac{n^2}{2}\) ,所以这一部分就是 \(\frac{n}{B}*B^2=nB\) 的。每次询问把对应的信息加起来就好了,就是 \(q*\frac{n}{B}=\frac{qn}{B}\) 的。取 \(B=\sqrt{q}\) 即可平衡至 \(n\sqrt{q}\) 。
(upd:突然发现今年 THUPC 有个题就能拿这个做)
3. loj2461 完美的队列
观察询问的形式,发现只关心每个操作插入的数多久会被全部弹出。考虑把每次操作用线段树拆开,离线下来,对每个节点的操作分别计算其被完全弹出的时间。
现在相当于是有若干次区间加操作,然后还有一些询问形如,从某个操作出发,到哪个操作才会使得每个位置值的增加量都 \(\geq a_i\) 。这个显然能双指针算。但可以发现这里的区间加操作是很多的,怎么办呢,你发现全局加的操作都是其祖先带来的,其他操作都是其子树内的点带来的。于是按 dfs 的顺序做这些点,用 BIT 来维护这些祖先带来的修改,双指针就只对剩下的这些操作做,计算准确的答案时在 BIT 上求 kth 即可。
分析一下这剩下的操作的总和,它相当于是每个操作插入时经过的节点个数之和,这是 \(O(n\log n)\) 的,总复杂度即 \(O(n\log^2n)\) 。
4. qoj8526 Polygon II
想起来这场这个题还挺好的,写一下。算组不成多边形的条件就是存在一个条边 $\geq $ 剩下的边和,考虑这个边权是在 \([0,2^{a_i}]\) 随的,设第 \(i\) 条边边权是 \(x_i\) ,可以变成 \(\sum x\le a_i\) 。
把 \(x_i\) 拆成整数和小数部分,那么其整数在 \([0,2^{a_i})\) 间随,完全可以拆成:\(\frac{1}{2}\) 的概率加上 \(2^0\) ,\(\frac{1}{2}\) 的概率加上 \(2^1\) ..这样的,而小数部分在 \([0,1]\) 里随,这就很好处理了。最后数位 dp 一下即可。
5. P9105 [PA2020] Trzy drogi
建出 dfs 树,可以发现只有选三条树边的情况难处理,其他情况都能利用异或哈希和一些讨论解决。接下来通过一种炫酷操作让每个点度数 \(>2\) ,那我们处理三树边的情况其实就可以把那些非树边的两个端点合并起来,递归下去,由于 \(|E|\geq \frac{|3|}{2}|V|\) ,所以非树边个数 \(\geq \frac{1}{2}|E|\) ,我们就只会做 \(O(\log m)\) 轮。
考虑异或哈希后一个边的边权是 \(w_i\) ,那我们就希望取的三条边中有一个子集异或和为零。
先毙掉 \(w_i=0\) 的边(即割边),直接把包含它的方案数算完之后把两端缩起来。
再把存在选的两条边权值相等的情况的方案数算出来,之后可以发现对于权值相同的边其实我们只需要保留一条进行计算即可,可以看成是此时每个边有了长度,我们把所有权值相同的边的长度加到其中一条上,把剩下的缩起来即可。
可以发现这样处理之后每个点度数就 \(\geq 3\) 了。
6. qoj1267 Count on a Tree II Striking Back
直接计算颜色个数非常困难,考虑使用随机化来刻画这个颜色个数。考虑 \(k\) 个 \([0,1]\) 间的随机实数的最小值的期望是 \(\frac{1}{k+1}\) 。于是考虑直接对每种颜色随一个数,我们比较两个颜色个数的时候就直接比较这个最小值就行了。当然只随一遍显然是很错的,考虑多随几遍然后把这个值加起来就好了。
7. UNR D1T3
先把 \((x,y)\) 转成 \((x,x+y)\) ,现在路径形如每次往右/右下。
每次询问,求出从 \((x,y)\) 开始只往右走能走到哪里,这个可以 SA 预处理之后求 lcp 解决。
设能走到 \((x,p)\) 。那我们只要知道哪些 \((x',p)\) 是能走到的,就可以递归的做下去了。
怎么求哪些 \((x',p)\) 能走到呢?相当于有 01 矩阵 \(A_{i,j}=[c_{x,j}=c_{i,j}]\) ,问你从 \((x,y)\) 出发能走到哪些 \((x',p)\) 。你发现这个矩阵只和 \(x\) 有关系,就完全转化成一个 ds 题了,猫树处理一下就好了。
分析一下复杂度,预处理 \(O(n^2m\log m)\) ,单次查询大概是 \(T(n)=n+\sum\limits_{i=1}^{n-1}T(i)\) ,这是 \(O(2^n)\) 的,于是总复杂度 \(O(n^2m\log m+q2^n+(L+nm)\log(L+nm))\) 。
很遗憾这个写出来是 97 。
正解是这样优化的:
考虑“递归的做下去”这一步。其实我们可以优化:我们现在得到了哪些 \((x',r+1)\) 是能被走到的,把这个集合直接压下来就好了,不需要挨个递归做,每次还是取其中最小的行求出来往右能走多远,求哪些 \((x',r)\) 仍然可以猫树解决。由于每次最小的行都在增加,单次查询复杂度就是 \(O(n^2)\) 的了。
8.UNR D2T3
考虑对序列分治处理。考虑把 min 给拆开,即枚举 \(x\) ,所有 \(a_i\) 都要 \(\geq x\) 。那从小到大枚举 \(x\) ,设 \(l_i\) 是在第 \(i\) 时刻左边能取的长度,\(r_i\) 同理,那现在我们要做的操作就是对 l/r 的一段区间取 min ,再维护一个序列 \(c_i\) ,有把全局的 \(c_i\) 加上 \(zl_ir_i\) 的操作。吉司机线段树即可,只不过这个非常难写。
9.NOI D1T3
考虑性质 A 怎么做。只能是偶数层的边向上,奇数层的边向下,或者反过来。
考虑怎么判定合法,如果一个限制只有一条未被定向的边,且限制还未被满足,那就直接定向了。一直这样做下去,如果中间出现了不合法肯定就无解,否则就很容易构造出解了。
那考虑直接做这个过程,先把能定的定了,再每次取出编号最小的没被编号的边,此时它往那边定都是可以的,于是直接定成 0 并继续把能定的定了。直接写就有 64pts 。
优化就树剖一下,转化成链就挺好做了。
10. qoj6640 Talk That Talk
很天神的题。判定是否有二次剩余当然就是看 \(a^{\frac{p-1}{2}}\) 模 \(p\) 是 \(-1\) 还是 \(1\) 。令 \(g_i=i^{\frac{p-1}{2}} \bmod p\) ,我们枚举 \(d=j-i\) ,接下来关键的一步是,构造 \(g_ig_{i+d}+g_{i}g_{i+2d}+g_{i+d}g_{i+2d}\) ,你发现如果三个都是 1/-1 ,那这个式子就是 \(3\) ,否则就是 \(-1\) 。求出这个和就容易计算答案了。考虑先当成 \(1\le i<p\) 来算,再减掉 \(i\geq p-2d\) 的部分,减掉的这部分容易前缀和计算。
接下来以 \(g_ig_{i+d}\) 为例,它等于 \((i(i+d))^{\frac{p-1}{2}}\) ,可以拆成一个和 \(i\) 相关的多项式,项数 \(\le p-1\)。我们考虑 \(\sum\limits_{i=1}^{p-1}i^k\) 这个式子,模 \(p\) 时在 \(k<p-1\) 时都等于 \(0\) ,\(k=p-1\) 时等于 \(p-1\) 。于是 \(\sum\limits_{i=1}^{p-1} g_ig_{i+d}+g_{i}g_{i+2d}+g_{i+d}g_{i+2d}=-4\) ,这就做完了。