「2024 May」做题笔记

CF1566H Xor-quiz

\(\sum\) 为异或和。

首先我们只用询问 \(\mu_i\neq 0\) 的数,发现个数已经 \(< 0.n\) 了。然后继续这么想发现质因子集合相同的都是等价的。

能不能找出 \(b_i\) 表示质因子集合乘积为 \(i\) 的异或和呢?我们有 \(a_i=\sum_{(i,j)=1}b_j\),似乎不能直接莫反。但是注意到这里的值域都是 \(\mu\neq 0\) 的数,所以 \(a_i=\sum_{d|i,d|j}b_j\),不难发现一个 \(b_j\) 会贡献 \(2^{prime}\) 次,所以是等价的。令 \(g_d=\sum_{d|j}b_j\)\(a_i=\sum _{d|i}g_d\),同理可以直接反演 \(b_j=\sum_{j|d}g_d\)\(g_d=\sum_{i|d}a_i\)

然后问题转化成每个等价类选一些数异或和为 \(b_i\),总个数为 \(n\)

由于数据随机,可以 bitset dp,但是是随机选子集。更简单地,直接随机调整:每次随机一个等价类,再随机一个子集取反,若调整后答案更接近 \(n\) 就换。

线性基输出方案可以记录线性基中某个元素加入时异或的子集。于是就做完了。


BBQ Hard加强版

狄利克雷卷积拆成独立的就行了。也可以根号分治。


CF1616G Just Add an Edge

好 tm 恶心的题。

先讲讲容易理解的 \(n^2\) 做法。本题可以转化为 \((x,y)\) 的对数,使得原图可以被划分为以一条 \(x\) 结尾和 \(y\) 开头的路径。画出这个图,假设固定 \(y\),看看 \(x\) 的答案是否能转移?发现只要 \(x+1,x+2,...z\) 是一条连续的链,且 \(x\rightarrow z+1\) 有边,那么 \((x,x-1)\) 可以转移到 \((z+1,z)\),所以设 \(dp_{i,0/1}\) 为是否能到 \((x,x+1)/(x+1,x)\)

若原图 \(1\rightarrow 2\rightarrow 3\rightarrow...\rightarrow n\) 存在,那么答案为 \(\frac {n(n-1)} {2}\),否则一定存在 \(p\)\(p+1\) 不相连,找到最小的。

那么必定在 \((p,p+1)\) 断开。考虑从这个点向左右转移。合并左右答案即为线性。

细节有点多,而且我还没有完全理解。


qoj1286 Ternary String Counting - Problem

\(n^3\) dp先别急着扔掉做法啊。(

dp 为:\(dp_{i,j,k}\rightarrow dp_{i+1,j,k},dp_{i+1,j,i},dp_{i+1,k,i}\)。当然要处理出 \(L2_i,R2_i,L3_i,R3_i\) 表示后两维的范围。

发现每次就是保留之前的矩阵,或许向某个元素加某一个列或者某一行。维护列、行的和,每次要添加数或者删除数,但是注意到添加的数都是 \(dp_{?,i}\),所以每一个数只会被添加一次,暴力删即可。

\(L2,R2,L3,R3\) 就修改 \(r\) 处的值就好了,后面的或者前面的其实都被制约到了。


【UR #8】决战圆锥曲线

只要注意到 \(a_i\) 越大值就一定越大就好了。线段树先跑右子树再跑左子树即可。


P5065 [Ynoi2014] 不归之人与望眼欲穿的人们

sol1:

or 的经典性质是变化 \(\log\) 次,但是可以从 \(n\) 个点出发啊?

发现很像分治能解决的问题。所以直接线段树维护。那么维护前缀 or,后缀 or 变化时候的值和下标,中间暴力 log^2 合并。

那么每次要修改 log^3 个信息,我们把这些放进长度为下标的线段树,然后每个位置用懒惰删除的堆维护即可。

时间复杂度 \(O(n\log^4 n)\)

sol2:

我看不懂题解,咕咕咕。


【UR #4】追击圣诞老人

犯唐了。

把加入所有出边改为加入第一个儿子或者下一个兄弟。问题转化为快速找到三条链的 \(k\) 大值。

可以建主席树,但是会被卡空间。

考虑树剖,这样可以 log 查询任意一条链的最大值,所以每次断链即可。


CF1943D2 Counting Is Fun (Hard Version)

犯唐了。

考虑容斥,容斥一些钦定不合法的,那么设 \(dp_{i,j}\) 为第 \(i\) 个选 \(j\)

\(i+1\) 钦定合法,那么 \(dp_{i+1,u}\leftarrow dp_{i,j}\)。否则,\(dp_{i+2,u}\leftarrow -dp_{i,j}\times \max(0,k-(u+j))\)。记两个数组前缀和 dp 即可。


CF1943E1 MEX Game 2 (Easy Version)

首先考虑二分。

Alice 的策略肯定选当前个数最少的,如果当前 Bob 操作时出现一个及以上 \(a_i<k\) 的,那么 Bob 就赢了。

这个相对顺序感觉起来肯定是不会变的,也就是说,Bob 会优先在后缀上删数,使得删完他们的相对顺序也不会变。

考虑枚举哪个数在 Bob 操作时 \(<k\)。每次 Alice 操作后,从后往前枚举,二分,看当前数能否到这个值即可。

时间复杂度 \(O(n^4\log^2 n)\)。比其他 easyver. 的做法多了个 nlog。


CF1943E2 MEX Game 2 (Hard Version)

如何把 \(O(n^4\log^2 n)\) 的算法优化到 \(2\times 10^5\) 能过?

现在 Alice 的策略很明晰了,考虑把 Bob 的策略简洁地表示出来。

发现就是每次选最大的减 \(1\)!那么维护相同即可。

好像可以做到 \(O(n^3\log_2 n)\) 了。

我看不懂题解,咕了。


CF1630F Making It Bipartite

可以翻译成一个点要么是倍数,要么是因数。

那么拆点变成 \((x,0)\)\((x,1)\) 表示倍数和因数,若 \(x|y\)\((x,0)-(y,0)\)\((x,1)-(y,1)\)\((x,0)-(y,1)\)\((x,0)-(x,1)\) 表示不能同时出现。转化成一般图最大独立集。

发现这个东西有传递性。那么独立集就是反链了,所以转化成最小链覆盖,再拆点跑最大匹配即可。


[AGC029F] Construction of a tree

考虑 \(1\) 固定,\(2\sim n\) 和这 \(n-1\) 个集合求一个匹配,若没有完美匹配则一定无解。

否则,从 \(1\) 扩展,能连就连。

考虑一下正确性:若当前还有点但是连不了,说明剩下集合中并没有前面出现的所有数,这个时候怎么调整匹配都是不行的,所以无解了。否则就一定有解。


[AGC038F] Two Permutations

考虑最小割二选一模型。分讨一下 \(P_i\)\(Q_i\) 的情况即可。注意不要拆点。

感觉这个题很玄学。


[ARC175F] Append Same Characters

考虑答案为添加的字符串 \(|X|\) 加上逆序对个数。

分析一下性质,注意到只会改变一个串是另一个串子串的情况。设多出来的部分为 \(Y\),那么就是 \(YX<X\)

引理:\(YX<X\Leftrightarrow Y^{+\infin}<X\),这启示我们按照 \(Y^{+\infin}\) 从大到小排序。

引理:\(X^{\infin}<Y^{\infin}\Leftrightarrow XY<YX\)

注意 \(Y\) 只会是某个串的后缀,只会有 \(O(n)\) 个,全部拿出来排序即可。

那么只需要 \(Y_i^{\infin}>X\geqslant Y_{i+1}^{\infin}\)\(\min(len_X)=lcp(Y_i^{\infin},Y_{i+1}^\infin)+1=lcp(Y_iY_{i+1},Y_{i+1}Y_i)+1\)。(不能为前缀关系)

把所有串拼在一起即可使用 SAM/SA 维护,时间复杂度 \(O(n\log_2 n)\)


[ABC347G]Grid Coloring 2

存在一种最优解使得所有 \(A_i\neq 0\)

将一个点拆成 \([x\leqslant a_i]\),那么每个点贡献 \(2x-1\),并且每个这样的点对贡献 \(1\)

可以建成权闭合子图。那么 \(A_i=0\) 就是 \(a_{i,1}\) 必须选,\(A_i=k\) 就是 \(a_{i,k}\) 必须选,\(a_{i,k+1}\) 不能选。必须选用 \(-\inf\) 指向它,不能选用它指向 \(+\inf\) 即可。

那么就做完了。


[ARC161F] Everywhere is Sparser than Whole (Judge)

需要对最小割的深刻理解。

首先密度子图有权闭合子图做法,就和上个题一样。所以现在瓶颈在于判断是否存在子图密度 \(=D\)

考虑钦定 \(S\rightarrow a_1\) 不割,设为 \(\inf\),那么就是必选。此时跑最小割,注意到最小割的所有方案都在满流边中,所以只需要存在一个边(\(a_2\sim a_{n*n}\))使得 \(S\) 通过残余网络不能到它。

考虑钦定不选。此时跑最小割只需要不全割左边。那么一样的,存在右边一个点 \(T\) 不能到达。

发现密度 \(>D\) 的子图也不用先判一遍,直接跑这个算法,也是对的。


CF1450H1 Multithreading (Easy Version)

考虑给定一组序列如何计算最小值。

首先不难发现最优策略是每次删去两个相同的,最后剩下 BWBWBWBW...,然后答案即为 \(cnt/4\)

如何快速找出删去后还剩多少个字符?发现匹配的两个同色点一奇一偶,并且最后匹配结束全为奇或者全为偶。那么答案啊就是 \(|(cnt_e-cnt_o)|/2\)

答案就是 \(\sum_{i=0}^{k_1}\sum_{j=0}^{k_2}|\frac {d-i+j} {2}|\binom {k_1} {i}\binom {k_2} {j}\)

可以直接 FFT。

但是这肯定将问题一般化了,原题是组合数,考察 \(i-j\) 项的系数,发现这就是范德蒙德卷积啊!所以 \(O(n)\) 就可以了。


P5326 [ZJOI2019] 开关

抄了一篇题解,多项式怎么练啊?

考虑 [AGC034F] RNG and XOR 的思想,将其表示为集合幂级数。

\(F(x)=F(x)G(x)+I-2^{n}\),即 \(F(x)(1-G(x))=\sum_T x^T-2^n\)

直接除过去跑复杂度不能接受,考虑在此处 FWT。即 \([x^U]\widetilde F(x)(1-\widetilde G(x))=[x^U]\sum_T (-1)^{U\& T} -2^n\)

\(U=\empty\),原式成立,事实上那个 \(2^n\) 就是这么推出来的。

否则 \([x^U]\widetilde G(x)<1\),除过去变成 \([x^U]\widetilde F(x)=[x^U]\frac{\sum_T (-1)^{U\& T} -2^n}{(1-\widetilde G(x))}\)。发现 \(\sum_T(-1)^{U\&T}=0\)。所以 \([x^U]\widetilde F(x)=[x^U]\frac{-2^n}{(1-\widetilde G(x))}\)

形式够简洁了,我们代回去。 \(f(T)=2^{-n}\times\sum_U(-1)^{T\& U}[x^U]\widetilde F(x)=\sum_{U\neq \empty} (-1)^{T\& U}[x^U]\frac{-1}{(1-\widetilde G(x))}+[x^{\empty}]\widetilde F(x)\times 2^{-n}\)

其实 \(\widetilde G(x)\) 的某一项是非常好算的,\((-1)^{T\& U}\)\([x^\empty]\widetilde F(x)\times2^{-n}\) 比较难处理。

考虑我们并没有用到 \(f(\empty)=0\) 的条件。将其代入,那么 \(\sum_{U\neq \empty}[x^U]\frac{1}{(1-\widetilde G(x))}=[x^{\empty}]\widetilde F(x)\times 2^{-n}\)

所以 \(f(T)=2\sum_{U\neq \empty} [2\nmid|T\& U|][x^U]\frac{1}{(1-\widetilde G(x))}=\sum_{U\neq \empty} [2\nmid|T\& U|][x^U]\frac{1}{\sum p_i}\)

即选奇数个为 \(1\) 的数。直接背包即可。

其实多猜几次就可以猜到这个转移了。(


CF1450H2 Multithreading (Hard Version)

考虑 easy version 的式子 \(\sum_{i=0}^{k_1+k_2}|\frac {t-k_2+i} {2}|\times\binom {k_1+k_2} {i}\times [2|t-k_2+i]\)

\(k=t-k_2,cnt=k_1+k_2\),把除以 \(2\) 放在全局,即求 \(\sum_{i=0}^{cnt}[2|k+i]\times |k+i|\times \binom {cnt} i\)

分讨拆绝对值,\(ans=\sum_{i=0}^{-k}(-2k-2i)\binom {cnt} {i}+\sum_{i=0}^{cnt} (k+i)\binom {cnt} {i}(2|k+i)\)

\(\Rightarrow ans=-2k\times \sum_{i=0}^{-k} \binom {cnt}{i}-2cnt\sum_{i=0}^{k-1}\binom {cnt-1} {i}+k\sum_{i=0}^{cnt}\binom {cnt} {i}+cnt\sum_{i=0}^{cnt-1}\binom {cnt-1}{i}(2|k+i)\)

后面两项的维护是简易的,前面两项,注意 \(\sum_{i=0}^k\binom {cnt}{i}\times [2|k+i]=\sum_{i=0}^k \binom {cnt-1} {i}\),所以也可以直接类似莫队的样子维护。所以就做完了。


P6109 [Ynoi2009] rprmq1

你可能想到要维护时间大于等于某个值的历史最大值。原因是这是个 4-side 问题。

那么直接分治即可。就做完了。


CF1805F1 Survival of the Weakest(easy version)

数据范围可以暴力 \(O(n^2\log_2 n)\) 做,但是数太大了可能会爆掉。

注意到每次操作后极差不升:一次操作后 \(a'_1=a_1+a_2\)\(a'_{n-1}\leqslant a_1+a_n\),极差 \(\leqslant a_n-a_2\leqslant a_n-a_1\)

所以每次将 \(a_{2\sim n}\) 都减去 \(a_1\) 即可。


CF1805F2 Survival of the Weakest


[Ynoi2014] 等这场战争结束之后

建出操作树,考虑撤销并查集。

发现 polylog 不能很好适配,结合 \(kth\),直接值域分块。

维护第 \(i\) 个块数的个数,散块暴力查,时空复杂度都是 \(O(n\sqrt {n\log_2 n})\)

套路地一个块一个块跑,空间就降到了线性。

然后散块的操作可以在合并分裂的时候平衡复杂度,维护一个链表,然后查询时 nth-element 即可消去 log。

空间线性被卡。


[ARC142E] Pairing Wizards

首先,形如某个数加 \(x\) 可以拆点,连 \(((i,x),(i,x-1),\inf)\)\(((i,x),T,1)\),然后跑最小割。

原图是一般图的形式不太好处理,让我们进行一步转化:若 \(a_x<\min(b_x,b_y)\),就 \(a_x\leftarrow \min(b_x,b_y)\)\(a_y\) 同理。

转化后,设 \(b_x<b_y\),不合法的情况为 \(b_x\leqslant a_x,a_y<b_y\)

发现此时为二分图!所以对于 \(a_x\leqslant b_x\) 的情况,连 \((S,x,b_x-a_x)\),否则左边是有选择的,就按照第一句话的方式建边。然后连 \((x,(y,b_y-a_x),\inf)\)。跑最小割即可。


CF1416F Showing Off

连成基环森林。

发现由于一定是偶环,环一定长度为 \(2\) 最优。

考虑若这个数周围有小于它的数,那么可以直接指向它。否则必须找周围一个相等的数匹配。

发现就是上下界二分图匹配,跑上下界网络流即可。


[AGC031E] Snuke the Phantom Thief

枚举总数,转化成横纵坐标前缀珠宝的范围。

试图转化成对每个元素的限制,发现可以找到每个珠宝横纵坐标的范围。

然后随便连边跑费用流即可。


P6967 [NEERC2016] Delight for a Cat

考虑这样一个模型:有 \(n\) 个区间,每个有费用和个数限制,每个被覆盖的元素有上下界的覆盖限制。

考虑 \(l\rightarrow r +1\)\(i\rightarrow i+1\) 跑最大流。\(l\rightarrow r+1\) 就表示 \([l,r]\) 要选。

这个题限制在区间上,考虑区间和点的含义交换,就做完了。由于下界相同跑最大费用最大流即可。


CF1051G Distinctification

简单题。但好像稍微打复杂了?


CF1965E Connected Cubes

由于所有颜色紧贴很容易切断另外一条颜色的出路。想到构造类似阶梯状的图使得列与列中间有空列。

那么就好做了,一层解决一个颜色即可。

具体可见洛谷第一篇题解。


CF1909I Short Permutation Problem

考虑固定 \(m\),考虑 \(k=n-1\) 的情况。

将原数列按照 \(\min(i,m-i)\) 排序,两个数合法当且仅当前面一个数 \(>\frac {m} {2}\)

考虑按照 \(\min(i,m-i)\) 的顺序对序列插入元素。那么当前一个数相邻两个位置一定 \(>\frac m 2\)

也就是说,初始 \(t=1\),若插入 \(>\frac m 2\) 的数 \(t\leftarrow t+1\),否则 \(t\leftarrow t-1\),方案数即为 \(\prod t\)

可以预处理阶乘 \(O(1)\) 解决。

考虑一般的 \(k\),钦定 \(i\) 对位置满足题意。最后二项式反演即可。那么剩下 \(n-1-i\) 对相当于将序列分成 \(n-i\) 段。让初始值 \(t=n-i\) 即可。

但是这样可能有某些段为空,所以再容斥一下就好了。

所以对于每个 \(m\) 跑两遍 NTT,时间复杂度 \(O(n^2\log_2 n)\)


2022-2023 集训队互测 Range Minimum Element

考虑判断一组 \(\{b\}\) 是否合法。

那么 \([l,r]\) 中的元素都要 \(\geqslant b_i\),考虑 \(a_i=\max_{l\leqslant i\leqslant r}b_i\),发现增大 \(a\) 中元素毫无意义。但是 \(\{a\}\) 正向操作要能变成 \(\{b\}\),所以现在要计数这样能生成的 \(\{a\}\) 的数量。

考虑从大到小填数,那么现在应该有若干连续段,考虑使用区间 dp 计数。

\(dp_{l,r,w}\)\([l,r]\)\(\geqslant w\) 的方案数。令 \(F(l,r)\)\([l,r]\) 被某些区间恰好覆盖的。这个可以预处理。

每次可以找到区间内第一个 \(=w\) 的数 \(u\),此时需满足 \(F(l,u-1)=1\)。右边的可以继续 dp。所以 \(dp_{l,r,w}\leftarrow dp_{l,u-1,w+1}\times dp_{u+1,r,w}\)。还有全不选 \(w\),那么 \(dp_{l,r,w}\leftarrow dp_{l,r,w+1}[F(l,r)=1]\)

边界是 \(dp_{l,r,w}=1\),还有 \(dp_{i,i,w}=1+F(i,i)*dp_{i,i,w+1}\)

你可以理解为前面已经判断了类似 \(F(l,r)=1\) 的东西,所以后面把随便某个数看成 \(w\) 是合法的。

此时复杂度 \(O(n^3c)\)。注意到 \(dp_{l,r}\) 是关于 \(w\)\(len\) 次多项式,所以可以插值。时间复杂度 \(O(n^4)\)


P10107 [GDKOI2023 提高组] 树

把两个符号看反了,有点搞笑。

考虑链怎么做,结合异或的性质,设 \(f(x,i)\)\([x,x+2^i)\)\(v_j \oplus dis\) 的总和。那么 \(f(x,i)=f(x,i-1)+f(x+2^{i-1},i-1)+w(x+2^{i-1},w+2^i-1,i-1)\)。其中 \(w(l,r,k)\) 表示 \([l,r]\)\(k\) 位是否存在提供的贡献(\(2^k/-2^k\))。原因是后面一半只会在第 \(i-1\) 有偏差。

查询发现也这样做即可,单 log。

考虑树,解法是前缀和,先咕了。


P8923 『MdOI R5』Many Minimizations

考虑原问题的 slope trick 做法:每次加入两个 \(a_i\),删去最大值,答案即为 \(\sum mx_i-a_i\)

发现答案只和剩下数的和有关,这就比较优美了。

考虑将 \(x\) 改为 \(\sum[i\leqslant x]\)。若枚举 \(i\),可以将问题转成 \(01\) 序列。

那现在只和 \(0\)\(1\) 的个数有关了,考虑转成格路计数:从 \((0,0)\) 开始,每次可以向 \((1,1)\) 或者 \((1,-1)\) 方向走一步,方案数分别为 \(m-i+1\)\(i\)。若 \(<0\) 就变成 \(0\)。求 \(\sum f_ii\),其中 \(f_i\) 为到 \((n,i)\) 的方案数。

非常人类智慧地,若当前 \(<0\),那么将这段前缀加 \(1\),发现新路线与当前路线构成了双射,且终点没变!

那么转化为不能超过 \(y=0\) 的方案数。那就是经典做法了。但是已经要经过一次 \(y=0\),所以减去 \(y=1\) 的方案数。

推推式子是 \(\sum_j (\sum_x x^j \times (m-x)^{n-j})\times (\sum_{i+2j\geqslant n}(\binom {n} {i+j}-\binom {n}{i+j+1})\times (2j+i-n))\)

前面那个可以插值,可以做到 \(O(n^2)\)

稍微有些卡常,使用常见卡常方法即可通过。


CF917D Stranger Trees

其实这题我做过,但是今天看到了另解。

回顾一下原做法:首先转成钦定 \(i\) 条重复,若已知重复边集,那么方案数为 \(n^{k-2}\times \prod siz\)。那这相当于每个连通块选一个点提供 \(n\) 的贡献,树上背包即可。\(O(n^2)\)

考虑把原来的边看成 \(x\),新边看成 \(1\),求生成树数量会怎样?那么 \(ans_i\) 就是第 \(i\) 项的系数。

想到插值,代入 \(n\) 个点值跑矩阵树定理,时间复杂度 \(O(n^4)\)


CF1774G Segment Covering

恰好包含比较难绷,咕咕咕。


Flower's Land 2 - Problem

抵消的问题可以想到矩阵与矩阵的逆。

那这个题直接奇数换成 \(A\),偶数换成 \(A^{-1}\),最后看是不是 \(I\) 即可。矩阵可以随机。


DFS Order 3

两个性质:第二个点一定与其相连,最后一个点一定是叶子。

考虑从点 \(1\) 的 dfn 倒着还原,形如儿子向父亲合并的操作。

那么对于这个点,第一个没出现的点就是它的父亲。那么就做完了。


qoj6508 This is not an Abnormal Team!

有点像匹配。

如果出现了长度为 \(4\) 的链,那么可以拆成两对。

也就是说,每个点有两个匹配位置。那么让单点最少就是让没匹配的点最少。把第一条边的花费设为 \(-\inf\) 跑费用流即可。那么第三条边最少就是把第二条边设为 \(-1\)

直接跑是 \(O(nmf)\) 的。但是注意只可能有两种流量,可以先跑第一种,跑完后加入第二种边,跑最大流即可。时间复杂度 \(O(m\sqrt n)\)

不知道能不能不用动态加边而是控制最短路的方式,反正我现在觉得不是很好做。


qoj6501 Graph Partitioning

等价于给 \(2n-2\) 个点找父亲。\(2n-2\) 条边可以分给两个点之一。

那么如果是基环树森林就有解并且是 \(2^{cnt}\) 次方,否则无解。


P5364 [SNOI2017] 礼物

写在这里提醒自己不要忘了矩乘。


posted @ 2024-05-09 16:47  Saintex  阅读(6)  评论(0)    收藏  举报