2024.5

1. CF1805F2 Survival of the Weakest (hard version)

先对 \(a\) 排序。先想想 F1,可以发现难点在于值域很大,但你发现我们可以把所有数减掉 \(a_1\) ,如果还剩 \(x\) 个操作就把答案加上 \(a_12^x\) 即可。每次一操作完就减,这样你可以发现序列中的最大值不会增大,这就做完了。

考虑 F2。 猜点结论,我们并不需要一直维护整个序列。设定阀值 \(L\) ,只取 \(a\) 中的一小段前缀来维护,并且操作完之后也只保留 \(L\) 这么长。发现对完了。

想想怎么证,不妨设 \(a_1=0\) ,若 \(a_2+a_3\le a_L\) ,说明 \(a'_1\)\(a'_L\) 都是不需要 \(a_{L+1}\) 参与的。所以保留是正确的。否则的话至少 \(a'_1\)\(a'_{L-1}\) 不需要 \(a_{L+1}\) 参与,有 \(a'_i=a_{i+1}-a_2\) 。再操作一次后至少前 \(L-2\) 个数是对的,我们有 \(a''_{L-2}\le a'_{L-1}-a'_{2}=a_L-a_2-(a_3-a_2)=a_L-a_3\) 。由于 \(2a_3\geq a_2+a_3>L\) ,则 \(a_L-a_3\le \frac{a_L}{2}\) ,于是 \(2a''_{L-2}\le a_L\) 。我们可以看做有效的部分减少了 \(2\)

由于每次减 2 时 \(a_L\) 减半,所以只需要把 \(L\) 约设为 \(2\log V\) 即可。复杂度 \(O(n\log V\log \log V)\)

2. hdu5404 Random Inversion Machine

考虑怎么对一个划分方案算答案。权值是每段的逆序对的个数的乘积,我们拆成在每个段内选一对数 \(u,v\),来计算对于每一对数都满足 \(u>v\) 的概率。思考这个概率该怎么算,如果 \(u,v\) 都不是关键位置,那乘上 \(\frac{1}{2}\) 就好了;两个都是关键位置不合法;然后考虑剩下的限制怎么处理。首先我们不妨直接要求 \(p_{x_1}<p_{x_2}<\dots<p_{x_m}\) ,算完答案后再乘上 \(m!\) 。我们把 \(p_u<p_v\) 的限制看成 \(u\) 连向 \(v\) 的边。我们知道,若形成了内向树,那直接用 \(\prod \frac{1}{sz_i}\) 计算即可。考虑剩下的限制,相当于 \(x_i\) 上可能会挂上一个点 \(u\),但边的方向有可能是 \(x_i\) 指向 \(u\) ,可以把它给容斥掉。为了方便计算,我们分析一下现在 \(\prod \frac{1}{sz_i}\) 的形式,其实就是 \(\frac{1}{sz_{x_m}!}\) 乘上那些被挂了点的 \(x_i\) 对应的 \(sz_{x_i}-1\)

现在考虑 dp ,设 \(f_{i,j,k}\)\([1,i]\) 被划分成 \(j\) 段,且 \([1,i]\) 最后一个关键点对应的 \(sz\)\(k\) 的所有方案权值之和,我们不要管 \(\frac{1}{sz_{x_m}!}\) ,最后乘上即可。转移考虑枚举 \(i,k\) 以及下一个段的末尾 \(r\) ,我们在枚举 \(r\) 的同时更新两个需要的系数 \(x,y\),最后转移即 \(xf_{i,j,k}\rightarrow f_{r,j+1,k}\)\(yf_{i,j,k+t}\rightarrow f_{r,j+1,k+t+1}\) 。 其中 \(t\)\((i,r]\) 的关键点个数。复杂度 \(O(n^4)\)

3. hdu5415 CRB and Substrings

考虑建出 sam。对于每个节点,考虑其 endpos 下标相邻的两个数 \(x,y\) 。对于 \(i\in (len_{f_u},len_u]\) ,若一个区间 \([l,r]\) 包含了 \([x-i+1,y]\) ,那就会让其答案减 1。

建出 fail 树来处理 endpos ,考虑做启发式合并,你发现所有合并一共只会产生 \(O(n\log n)\) 对不同的相邻二元组 \((x,y)\) 。我们对每个二元组处理出其第一次出现时对应的 \(len_u\) 和被分开时的 \(len_u\) 即可。考虑每次算答案,我们令 \(a_i\)\([i-k+1,i]\) 的答案,初始 \(a_i=\tbinom{k+1}{2}\) ,然后每个二元组对 \(a\) 的贡献可以写成两段一次函数的形式,容易通过差分处理,这样就计算出了每个长度为 \(k\) 的子串的本质不同子串个数了。最后要找字典序最小者,通过哈希+二分算 lcp 来判字典序即可。

4. 拟阵交

是这样一个过程,现在我们在求 \((U,I_1)\)\((U,I_2)\) 的交。

不断拓展我们的独立集 \(S\) ,对于 \(x\in S,y\notin S\) ,如果 \(S-x+y\)\(I_1\) 中就连边 \((x,y)\) ;在 \(I_2\) 中就连边 \((y,x)\) 。最后看有没有一条路径,从 \(y\notin S\) 且满足 \(S+y\)\(I_1\) 中的点出发,最后走到 \(y\notin S\) 且满足 \(S+y\)\(I_2\) 中的点。有的话就找一条最短的,把路径上状态全部翻转,否则就结束过程。

出现最多的一类拟阵应该是,\(U\) 是边,\(I\) 是所有不形成环的边集。

5. Petrozavodsk Winter 2023. Day 7: Gennady Korotkevich Contest 7

B. Classical Counting Problem

先思考判定一个集合合法的情况,不妨令 \(|S|\geq v\) ,因为另一种情况是对称的。令 \(K\)\(S\) 外的数的最大值,则我们需要对于 \(a\in S\)\(K-a\le m\) ,并且 \(\sum \max(0,K-a)\le mv\) 。先把整个序列排序,然后枚举这个 \(K\) 的位置 \(p\),dp 记下来 \(a\) 之和以及 \(|S|\) 大小,算到 \(p\) 的时候统计一下就好了。但这样是 \(O(Vn^4)\) 的,考虑优化,发现这个 dp 的为难之处在于 \(K-a\le m\) 的限制,但你发现随着 \(K\) 的增加,能取的 \(a\) 其实是个滑动窗口,我们知道计数时从背包删东西是容易的。复杂度 \(O(Vn^3)\)

E. Classical FFT Problem

\(a\) 从大到小排序,不难发现最小的棋子个数是最大的 \(t\) 满足 \(a_t\geq t\) ,因为你考虑大小为 \(t\) 的正方形需要至少 \(t\) 个棋子,而且我们此时取个对角线就能覆盖所有格子。

现在把棋盘分成这个大小为 \(t\) 的正方形,以及其上方/右方的部分,称之为 \(A,B,C\) 。那么 \(B,C\) 不能同时放棋子,否则是不够用的。考虑计算至少有一个棋子在 \(B\) 中的方案数。你发现此时每列必须取一个棋子。然后还得把 \(C\) 区域覆盖完,考虑容斥处理,设 \(C\) 区域有 \(h\) 行,那么方案即为 \(\sum\limits_{i=0}^h(-1)^i\tbinom{h}{i}(\prod\limits_{j=1}^t (a_j-i)-(t-i)^t)\) 。利用多点求值加速算中间这个东西,即可做到 \(O(n\log^2n)\)

I. Classical Minimization Problem

先考虑 \(y\) 互不相同的做法,是经典问题,每次用出现最多的 \(x\) 的点和其他的匹配即可。

现在考虑 \(y\) 相同,每次找到出现最多的 \(x\)\(y\) ,除 \((x,y)\) 以外找一个横坐标为 \(x\) 的,一个纵坐标为 \(y\) 的匹配起来。直到 \(x/y\) 互不相同,再用一维的做法来做,不难发现这样是最优的。

6. qoj2606.Gachapon

考虑 dp,设 \(dp_{i,j}\) 是 level-i rolling 中星数最大的卡 \(\le j\) 的概率,那么有 \(dp_{i+1,j}=dp_{i,j}^{b_{i+1}}-dp_{i,i}^{b_{i+1}}\) 。接下来要算这个期望,枚举 \(x\) ,考虑设 \(f_{i,j}\) 是第一个卡必须是 \(x\) 星的 level-i rolling ,且最大星 \(\le j\) 的方案数,可以发现 \(f_{i+1,j}=f_{i,j}dp_{i,j}^{b_{i+1}-1}-f_{i,i}dp_{i,i}^{b_{i+1}-1}\) ,初始值是对于 \(j\geq x\)\(f_{i,j}=1\) ,最后答案是 \(f_{n,n}\) 。然而这样是 \(O(n^3)\) 的,考虑优化,我们倒着来看,设 \(g_{i,j}\) 是上面的过程中 \(f_{i,j}\) 最后对 \(f_{n,n}\) 的贡献的系数,那么 \(x\) 时的答案就是 \(\sum\limits_{j\geq x}g_{0,j}\) 。这样就是 \(O(n^2)\) 的了。

7. Petrozavodsk Summer 2023. Day 7. PKU Contest

D. HearthStone

排序之后把问题看成是确定序列 \(b\) ,使得 \(\sum |a_i-b_i|\) 最小,且 \(b_{i+1}\le b_i+1,b_0=0\)

slope-trick 即可,两个堆维护一下。

B. Painting the Roads

把翻转 \((u,v)\) 路径上的边的操作,看成是先翻转 \(1\)\(u\) 的边,再翻转 \(1\)\(v\) 的边,于是转化成有一个序列 \(a\) ,每次操作把 \(a_u,a_v\) 翻转,最后要达到目标。对于每个操作的出发点 \(s\),先翻转 \(a_s\) ,最后我们要选 \(m\) 个终止点(可重),使得 \(a\) 最后满足条件,总代价是每个子树内终止点和起点之差的绝对值。于是考虑设 \(dp_{i,j}\)\(i\) 子树内起点-终止点=j 的最小代价。你发现有用的 \(j\)\([-sz_i,s1_i]\) 之间,其中 \(s1_i\) 是子树内起点个数。于是复杂度 \(O(n(n+m))\)

I. 01tree

鉴定为 [LNOI2022] 盒 的加强版。

G. Ald

鉴定为 CF1464F+qoj5020。

code

H. StrCartesian

考虑随机二分 trick。把 b 串排序后对每个 a 串维护 \([l_i,r_i]\) 表示拼上哪些 b 串能使得到的串在二分的范围内。每次在这些串中随一个 \(a_s+b_t\) 现在我们需要对每个 a 串算最大的 \(j\) 使得 \(a_i+b_j\le a_s+b_t\) 。用 sa 把所有串拼起来,预处理出 lcp,每次就能 \(O(1)\) 判断。最后二分出来 \(j\) 就好了。一个细节是如果二分到答案了就 break 掉,否则复杂度是错的。

复杂度 \(O(|\sum|\log|\sum|+qn\log m(\log n+\log m))\)

8. P3543 [POI2012] WYR-Leveling Ground

\(g=gcd(a,b)\) ,先把 \(A_i,a,b\) 都除掉 \(g\) ,如果 \(A_i\) 不是 \(g\) 倍数就无解了。

\(s_i=A_i-A_{i-1}\) ,我们相当于每次可以选两个数,让一个 +a/b 一个 -a/b。

我们先用 exgcd 解出 \(ax_0+by_0=1\) 的解,然后令 \(x_i,y_i\) 分别为 \(s_i\) 在 +a/-a 过程做的次数,\(y_i\) 为 +b/-b 时做的次数,则 \(ax_i+by_i=s_i\)\(\sum x_i=\sum y_i=0\) ,然后要让 \(\sum |x_i|+\sum|y_i|\) 最小。但其实这里由于 \(x,y\) 之和皆为 \(0\) ,我们改成算 \(\sum \max(0,x_i)+\max(0,-y_i)\) ,后面可以发现这样是很优雅的:

\(x_i,y_i\) 写成 \(s_ix_0+k_ib,s_iy_0-k_ia\) 的形式。由于 \(\sum s_i=0\) ,我们就需要 \(\sum k_i=0\) 。然后其贡献就是 \(\max(0,s_ix_0+k_ib)+\max(0,k_ia-s_iy_0)\) 。可以发现这关于 \(k_i\) 是个分段的下凸函数。又要让费用最小,于是只需要做个闵可夫斯基和就好了,复杂度 \(O(n\log n)\)

9. P9480 [NOI2023] 深搜

考虑容斥哪些关键点是合法的。

先思考性质 A/B 的做法。考虑此时哪些链是能取的。建出关键点的虚树,设其根是 \(u\) 。不妨把 \(1\) 加进虚树,那和虚树不交的链,以及被虚树中相邻两个点间的路径包含的链是合法的。

对于 \((f,u)\),设 \(f\)\(u\) 的第二个点是 \(v\) ,我们把 \(s_v\) 加上 \(1\) ,那么虚树外的链个数就是 \(m\) 减去虚树内点的 \(s_u\) 之和。再设 \(t_u\)\(u\)\(1\) 内部的链个数。\(d_u\)\(1\)\(u\)\(s\) 之和。接下来设 \(dp_u\) 是以 \(u\) 为根的虚树的权值和,然后对 \(u\) 的每个儿子 \(v\),计算内部的 \(2^{d_u-d_i}dp_i2^{u到i内的链个数}\) 之和。这是可以用线段树处理的,拍 dfn 序,在从下往上 dp 的同时对每个点维护这个值,每次一条 \(u\)\(k\) 的链就使 \(k\) 子树内的点权值乘 2,那就是区间乘,于是线段树支持区间乘以及区间求和即可。

设其为 \(g_v\) ,然后设 \(h_i\) 是有 \(i\) 个儿子取了关键点的方案数之和,发现这里 \(i\) 可以对 \(2\) 取 min,而也容易利用 \(g\) 算出。那如果 \(u\) 不是关键点,\(dp_u\) 即为 \(h_2\) ,否则为 \(-h_0-h_1\) 。 最后计算 \(dp_u2^{-d_u+t_u}\) 的和即可。

再来看非祖先-后代链对答案的影响。首先与 \(u\) 子树内的边不交,且与 \(1\)\(u\) 路径有交的是合法的,这部分链直接算到 \(t\) 里就好了。还有一类是这样的:\(u\) 并没有取关键点,且在虚树上有恰好两个儿子 \(a,b\) 。那么被 \(a\)\(b\) 包含的路径都是能算的。

那考虑在上面的过程中,我们算 \(h\)\(3\) 取 min ,统计答案时先减去 \(h_22^{-d_u+t_u}\) 。设 \(p_u=dp_u2^{-d_u}\) 。那其实就是对所有没有祖先关系的点对 \(a,b\),令其 lca 为 \(u\) ,计算 \(p_ap_b2^{d_u+t_u+a到b内路径个数}\) 的和。考虑维护 \(A_{dfn_a,dfn_b}\)\(a\)\(b\) 的路径个数,那每条路径对 \(A\) 的贡献其实就是矩阵加。再考虑 \(B_{dfn_a,dfn_b}\)\(u=lca(a,b)\) 对应的系数,那枚举这个 \(u\) ,它对 \(B\) 的贡献也是矩阵加。最后要算 \(q_xq_y2^{A_{x,y}}B_{x,y}\) 的和。

扫描线处理,枚举 \(x\) ,维护 \(a_y=q_y2^{A_{x,y}}\) ,支持区间乘,区间历史和即可。复杂度 \(O(n\log n)\)

code

10.【UR #27】景点观光

我真小丑。建出景区与王宫构成的虚树,则我们的路径一定会经过每条边恰好两次。现在我们确定一个景区的顺序来依次走,然后希望让其中长度为奇数的段尽量少。考虑设 \(a_x\)\(x\) 的深度的奇偶,那其实就是让 \(a_{p_x}\neq a_{p_{x+1}}\) 的位置尽量少。设 \(dp_{u,0/1/2}\)\(u\) 子树内的某个景区的排列,然后两头的状态都是 \(0/1\) ,或者一头 \(0\) 一头 \(1\)

接下来确定遍历儿子的顺序,特别的如果 \(x\) 是关键点,我们看成是一个两头皆为 \(a_x\) 的子树(有人场上觉得这个只能插到开头/结尾)。分类讨论就好了,我们把 是否有 01,00,11,以及 01 个数的奇偶性记下来就好了。

11.【UR #27】509 号迷宫

考虑对于 \(p|x\) ,记下 \(dp_{x,i}\) 为走到 \((i,x-i)\) 的方案数。 考虑怎么从 \(dp_{x,i}\) 转移到 \(dp_{x+p,j}\) 。若中间没有关键点,考虑对于 \(1<i<p\)\(\tbinom{p}{i}\) 模意义下都是 \(0\) ,那只用从 \(dp_{x,i}\) 转移到 \(dp_{x+p,i},dp_{x+p,i+p}\) 即可。再把关键点加进来,容斥计算即可,设 \(f_i\) 是到 \((i,a_i)\) 的方案个数,注意这里是从 \(a+b=x\) 这条线出发的。那你发现转移到 \(f_i\)\(f_t\) 以及 \(dp_{x,t}\) 只有 \(O(p)\) 个,即 \(i-t\le p\) ,直接计算即可。 复杂度 \(O(\frac{n^2}{p}+np)\)

12. PKUSC2024D1T2 正方形计数

妈的这啥啊,为啥有人能场上写出来。

枚举正方形的形态,求出来四个凸包的交,然后数里面的整点即可。数整点考虑拆成上凸包-下凸包,相当于每次要算 \(O(n)\)\(\sum\limits_{i=l}^r[(a_ix+b)/c_i]\) 这样一个东西,其中 \(a_i,c_i\) 是定值。把 \(0\le b<c_i\) 的答案的前缀和预处理出来,然后 \([(a_ix+b)/c_i]=[b/c_i]+[(a_ix+b\bmod c_i)/c_i]\) ,于是就规避了类欧。

真 jb 难写,最恶心的是它卡精度,求上/下凸包的时候改成全整数了才求得对。

而且求交的时候,你要看 \(x\) 哪段是满足上凸包在下凸包上面,这就很烦。

复杂度 \(O(nV^2)\)

code

13. PKUSC2024D1T3 独立

考虑 dp 套 dp ,即 \(f_{i,t_0,t_1}\)\(i\) 子树内不能选 \(i\) /可选 \(i\) 时的最大权独立集为 \(t_0/t_1\) 的方案数。但可以发现我们只需要把 \(t_1-t_0\) 记下来就好了,因为你考虑 \(dp_{x,0}=\sum dp_{v,1}\)\(dp_{x,1}=\max(dp_{x,0},a_x+\sum dp_{v,0})\) ,于是 \(dp_{x,1}-dp_{x,0}=\max(0,a_x-\sum (dp_{v,1}-dp_{v,0}))\) 。而且根据递推式子有 \(dp_{1,1}=\sum (dp_{x,1}-dp_{x,0})\) 。于是设 \(f_{i,j}\)\(t_1-t_0=j\) 的方案数,最后求 \(\sum f_{i,j}jm^{n-sz_i}\) 即可。容易发现 \(j\le m\) ,于是复杂度 \(O(nm^2)\)

考虑优化,归纳地可以发现除了 \(f_{i,0}\)\(f_{i,j}\) 是某个 \(sz_i-1\) 次多项式在 \(j\) 处的值。

证明的过程其实就是转移的过程:首先把儿子之间的 \(f\) 卷起来,形式如 \(h'_x=\sum\limits_{i=0}^{x} h_ig_{x-i}\) 。可以发现 \(h'\) 其多项式的次数是 \(g\) 的次数加上 \(h\) 的次数加 \(1\) ,因为你可以把这个东西写成

\(\sum\limits_{y=1}^{x-1}H(y)G(x-y)+h_0G(x)+g_0H(x)\) ,把 \(H(y)G(x-y)\) 拆成 \(\sum a_{i,j}x^iy^j\) ,其中 \(i+j\)\(\le\) g 的次数+h 的次数,而 \(\sum\limits_{y=1}^{x-1}y^j\)\(j+1\) 次多项式,所以最后次数是 <= g 的次数+h 的次数 +1 的。

也就是说我们把儿子都卷上后 \(h\) 的次数是 \(sz_x-2\) 。最后对于 \(x>0\)\(h'_x=\sum\limits_{i=0}^{m-x}h_i\) ,同理这里得到的 \(h\) 就是 \(sz_x-1\) 的。最后把 \(\sum\limits_{i=1}^m h_i\) 插出来,就可以得到 \(h_0\) ;同理把 \(\sum\limits_{i=1}^mih_i\) 插出来,贡献给答案。

现在考虑优化这个过程。我们知道,对于 \(dp_{i,j}\) ,只需要记下 \(dp_{i,0}\)\(dp_{i,sz_i}\) 即可,剩下的部分都能直接插出来。 考虑第一种转移:\(h'_x=\sum\limits_{i=0}^xh_ig_{x-i}\) ,可以考虑把 \(h,g\) 缺的部分分别插出来,这里的算量刚好是要合并的两部分的 siz 乘起来,所以总共是 \(O(n^2)\) 的。

再考虑 \(h'_x=\sum\limits_{i=0}^{m-x}h_i\) 。很遗憾的感受到这里就导致不能 \(O(n^2)\) 了。。

但可以优化成单次 \(O(t\log t)\) ,其中 \(t=sz_x\) 。具体的,设 \(f_i=\sum\limits_{j=1}^i h_j\) ,那么我们要算 \(h'_i=\sum\limits_{j=1}^{t}f_j\prod\limits_{k\neq j}\frac{m-i-k}{j-k}=(\prod\limits_{j=1}^t (m-i-j))\sum\limits_{j=1}^t f'_j\frac{1}{m-i-j}\) ,其中 \(f'_j=f_j\prod\limits_{k\neq j}\frac{1}{j-k}\)

做一遍卷积即可。总复杂度 \(O(n^2\log n)\) 。实现上直接维护 \(dp_{x,0}\)\(dp_{x,n+c}\) 就好了,反正也做不到 \(O(n^2)\) 了。

code

14. qoj6565 Game Show Elimination

分析一下当前剩下的人的状态,可以观察到若活着的人中次大者为 \(x\) ,则 \(\le x-m\) 的肯定都活着,于是把 \(x\) 和最大值 \(y\) 的编号记下来,但又发现 \(y\geq x+m\) 的情况是本质相同的,于是记下来 \(\min(m,y-x)\) 就好了。转移的式子是容易的,答案可以在转移时顺便算出。但转移时的系数得再想想。

你发现我们需要处理 \(m2^m\) 次这样的事情:对一个序列 \(a_i\)\(x_i\)\([a_i,a_i+m]\) 其中随机,然后算 \(b_i\)\(x_i\) 为次大值的概率。令 \(f(x)\)\(x_i=x\)\(x_i\) 为次大值的概率,然后把 \(f\) 积起来。然后你发现对于 \([z,z+1]\)\(f\) 一定是个 \(m-1\) 次多项式,计算它也是容易的:枚举最大的值的位置 \(j\) ,然后把 \(m-1\) 个一次多项式乘起来贡献给 \(f\) 即可。

总复杂度 \(O(2^mm^4+n2^mm^2)\)

15. PKUSC 2023 D1T2 狼人杀

把不包含 \(m\) 的区间看成是 ban 掉 \([1,l)\)\((r,n]\) ,包含 \(m\) 的区间看成是 ban 掉 \([l,m)\)\((m,r]\) ,把预言家的位置看成 ban 掉 \(x\) 。那其实就是求把所有除 \(m\) 的位置 ban 掉的期望时间,考虑 min-max 容斥。那看一下此时能取的区间的个数,设枚举的集合和 \(m\) 的并形成了位置 \(p_1,p_2,\dots,p_k\) ,令 \(p_0=0,p_{k+1}=n+1\) ,那么个数即为 \(\sum\limits_{i=0}^{k}\tbinom{p_{i+1}-p_i}{2}+p_1(n-p_k+1)\) 。对应的系数是 \((-1)^k\frac{n-k}{n-1}\) ,处理系数里这个 \(k\) 可以看成是选择了 \(k\) 个中的一个。于是枚举 \(p_1\) ,记下来当前选的最后一个位置,可取的区间个数以及是否选择了 \(k\) 个中的一个,复杂度 \(O(n^5)\) 。但可以发现这是愚蠢的,我们并不需要枚举 \(p_1\) ,因为 \(m\) 是一定会取的,按 \(m+1,m+2,\dots,n,1,2,\dots,m-1\) 的顺序来 dp 就好了。复杂度 \(O(n^4)\)

16. PKUSC 2023 D1T3 天气预测

先假设我们会做菊花了。从下往上处理每一条重链,对其顶端计算若干二元组 \((t,f)\) 表示其在 \(t\) 时刻 dp 值变成了 \(f\) 。这个怎么算呢,考虑把链上每个点的 \(f\) 表示成 \(kf_{son}+b\) 的形式。对每个点利用菊花的方法处理出来 \(k,b\) 的变化,即可利用线段树计算顶端的 \(f\)

接下来就是看菊花怎么做了。设 \(F_i(x)\)\(i\) 时刻所有点的 \((1-p+px)\) 的乘积,\(A_{j,i}=[x^j]F_i(x)\)\(b_i=[i>\frac{n}{2}]\) ,那我们要计算的就是 \(c=bA\) 这个序列。可能没有直观的做法,尝试看一下乘上 \(A^T\) 的效果然后用转置原理。

那此时就是需要计算 \(c_i=[x^i]\sum\limits_{j=1}^qb_jF_j(x)\) ,你发现这个就容易了:线段树分治处理 \(p\) 的修改,然后每个 \(F_i(x)\) 都是代表 \([i,i]\) 的叶子到根的多项式的乘积。这样计算最后的 \(c\) 就容易了,大概是 \(A_p=B_p(A_{ls_p}+A_{rs_p})\) 的形式,\(c\) 即为 \(A_1\)

复杂度 \(O(n\log^2n+q\log^3n)\)

code

17. The 2023 ICPC Asia Jinan Regional Contest

C. Turn on the Light 2

容易猜到树是最优的,然后注意到 \(m\) 很小,考虑直接搜,把大小 \(\le 21\) 的无根树全部搜出来。搜的方式是,取重心转化成搜 \(\le 10\) 的有根树,给每个不同的树一个标号,那让儿子标号单调不增就能实现不重复了。这样搜出来只有 4e6 个本质不同的树,所以是很快的。同时顺便对每种树维护 dp 的信息以及度数最大值即可。

L. Ticket to Ride

dp 是容易的,即 \(f_i+val(i+1,j)\rightarrow f'_j\) ,其中 \(val(l,r)\)\([l,r]\) 内包含的关键区间的权值和。想想这个怎么做到 \(O(n+m)\) 。从小到大算 \(f\) ,考察 \(g_i=f_{i-1}+val(i,r)\) 的变化,你发现若某一刻 \(x<y,g_x>g_y\) ,那 \(y\) 一定寄了。用链表维护当前 \(g\) 的前缀最大值所在的位置,每次修改时利用并查集找到要修改的位置,注意这里维护这些剩余的 \(g\) 的差分就好了。每次修改完对于差分 <0 的部分进行删除操作即可。

F. Say Hello to the Future

先想想整个序列的划分方案怎么算,限制形如 \(\max(a_l,a_{l+1},\dots,a_r)\le r-l+1\) ,可以发现扫 \(r\) 维护 \(l\) 的方法是不利的,考虑分治处理,令 \(b_i\)\(i\) 到划分线的 \(a\) 之 max ,限制就成了 \(\max(b_l,b_r)\le r-l+1\) ,拆一下就是二维偏序了。

现在处理 \(a_x\) 变成 \(1\) 怎么办。可以发现对于区间 \([l,r]\) ,如果次大值 \(m_2\le r-l+1\) 且最大值 \(m>r-l+1\) ,那么 \(m\) 所在的位置对应的答案就会加上 \(f_{l-1}g_{r+1}\) ,其中 \(f,g\) 是前/后缀的答案,这是通过之前的方法能算出的。

然后还是考虑分治,设 \(b2_x\)\(x\) 到分界线的次大值,不妨令最大值在右边,那么有 \(\max(b2_r,b_l)\le r-l+1<b_r\) 。可以发现这还是能拆成二维偏序,于是就做完了,复杂度 \(O(n\log^2n)\)

18. 2024 北京市大学生程序设计竞赛

C. 放苹果

\(s_i\) 为前 \(i\) 个盒子的苹果个数,则可以把一个方案的代价拆成 \(\sum\limits_{i=1}^{m-1}\min(s_i,n-s_i)\)

于是要计算的就是 \(\sum\limits_{i=1}^{n-1}\tbinom{n}{i}\min(i,n-i)\sum\limits_{j=1}^{m-1}j^i(m-j)^{n-i}\) 。拆开 \((m-j)^{n-i}\) 这一坨,即 \(\sum\limits_{j=1}^{m-1}\sum\limits_{k=0}^{n-i}\tbinom{n-i}{k}m^{n-i-k}(-1)^kj^{i+k}\) 。整理一下能写成一个差卷积的形式计算,其中要计算 \(f_k=\sum\limits_{i=1}^{m-1}i^k\) ,看成 \(k![x^k]\frac{e^{mx}-e^x}{e^x-1}\) 即可。

I. 括号序列

分析一下删的形式,把串写成 \((S_1)(S_2)\dots(S_k)\) 的形式。设其中没有进行删 )( 操作的位置是 \(p_1,p_2,\dots,p_m\) ,那你发现 \([1,p_1],(p_1,p_2],\dots,(p_m,k]\) 这些部分是独立的。那我设 \(g_i\)\((S_1)(S_2)\dots(S_k)\) 中所有 )( 都删了的操作方案除以 \((i-1)!\) 的方案数,\(f_i\) 是总方案数除以 \(i!\) 的结果,那我有 \(g_i=\sum\limits_{j=0}^{i-1}g_jf_{i-j-1},f_i=\sum\limits_{j=1}^i \frac{g_j}{j}f_{i-j}\) 。分治 NTT 计算即可,\(O(n\log^2n)\)

19. XX Open Cup named after E.V. Pankratiev, Grand Prix of Gomel

D. Div

乘上 \(x-1\) ,转换成判是否是 \(x^m-1\) 的倍数。先让所有项次数 <m ,就设系数序列为 \(a\) ,我们把 \(a_i\) 减掉 \(x\)\(a_{i-m}\) 加上 \(x\) 这样。如果此时 \(a_0\)\(a_{m-1}\) 都是 \(0\) 那解一定有无穷个;否则,考虑枚举 \(x\) ,我们把所有 \(a_i\) 的绝对值都通过进位的操作压成 \(<x\) ,发现此时合法等价于 \(a_i\) 全为 \(0/x-1/-(x-1)\) ,那其实就只需要枚举 \(x\le n+1\) 。然后分析一下复杂度,发现这个总进位次数就是 \(\sum \frac{a}{i}\) 的样子,所以总共就只会进 \(O(n\log n)\) 次位。用 map 处理这个过程,复杂度 \(O(n\log^2n)\)

G. Grp

首先观察到对于 \(2i\le k,\tbinom{n}{i}\le \tbinom{n}{k-i}\) ,而且大小 \(>\frac{k}{2}\) 的集合不能划分到一起。所以考虑这样对每个大小 \(i<\frac{k}{2}\) 的集合,找一个大小为 \(k-i\) 的和它划分到一起就好了。想想为什么这是有解的,因为这是一个正则的二分图。

特殊的情况是 \(k\) 为偶数时,大小为 \(\frac{k}{2}\) 的集合要尽量分成不交的若干对,这个怎么办呢。很难,得用带花树,证明可能也是不存在的,但程序说明在数据范围内是对的。而且求这个匹配看似复杂度很大,实际上每次增广路是很短的,所以跑的还是很快的。

H. Hit

先贪心的放置,即把区间按 \(r\) 排序然后从左往右看,如果当前的区间内部没有点就在 \(r\) 放一个点。你发现这样是很优的,如果当前最大的内部点数是 \(t\) ,那我们有:答案为 \(t\)\(t-1\) 。原因很简单,设这个最劣的区间取的点坐标分别为 \(x_1,x_2,\dots,x_t\) ,那么对于 \(2\le i\le t\) ,一定存在一个区间满足 \(r=x_i,l>x_{i-1}\) ,也就是说有 \(t-1\) 个不交区间被这个最劣区间包含,于是至少得取 \(t-1\) 个点。接下来的问题就是 check 答案是否为 \(t-1\)

考虑 dp,设 \(dp_x\) 表示是否存在一个放法一定放了 \(x\) 以及放了一些 \(>x\) 的点,使得所有 \(r_i\geq x\) 的区间都包含至少一个点,且不存在区间内部有至少 \(t\) 个点。思考怎么转移,首先取了 \(x\) 的话下一个点一定是最大的 \(y\) 使得 \(dp_y=1\)\([x+1,y-1]\) 内没有区间,这个不难反证说明。那设这个是 \(f_x\) ,找到 \(x\)\(t-1\) 级祖先 \(z\),看看是否有区间包含 \([x,z]\) 即可。复杂度 \(O(n\log n)\)

20. CF1648F Two Avenues

搞一棵 dfs 树然后分类讨论一下。发现比较难的部分是:选树上两个非割边 \(x,y\),使得跨过它们的非树边集合相同,设 \(v_x\) 是跨过第 \(x\) 条边的路径个数,\(val(x,y)\) 是同时经过 \(x,y\) 的路径个数,则此选法权值为 \(v_x+v_y-2val(x,y)\)

分析一下等价的边的性质。你发现等价的边都有祖孙关系。于是 \(val\) 是不难计算的,且把等价的边取出来后可以发现这具有决策单调性,直接计算即可,复杂度 \(O(n\log^2n)\)

再想想。继续分析性质,可以发现不存在 \(a<b<c<d\) 使得 \(a,c\) 等价,\(b,d\) 等价且 \(a,b\) 不等价,其中小于号是指祖孙关系。这就说明我们可以建出一个广义括号森林,然后考虑路径对答案的影响。对于从第 \(x\) 条边到第 \(y\) 条边的路径,如果 \([x,y]\) 不在一棵树内,可以把它拆成:对中间若干条链的贡献,以及对一个链的前缀,和一个链的后缀。否则找到 \(lca(x,y)\) ,类似的拆就好了。然后只需要下放前/后缀,这是容易的。

最后仍然要计算 \(v_x+v_y-2val(x,y)\) 型的问题,但此时我们直接枚举 \(r\) ,维护 \(v_l+val(l,r)\) 即可,做一个区间加/查max 的事情就好了。 复杂度 \(O(n\log n)\)

posted @ 2024-05-08 22:37  grass8woc  阅读(223)  评论(0编辑  收藏  举报