25年2月

学习草八牛。

一些 slope trick 和可并堆的题目见二月其它博客。

AGC040E

致远 dp 入门题。

操作是给某个前缀加上一个不降非负序列,或者给某个后缀加上一个不升非负序列。考虑若只有一个操作(不妨是前者),此时的操作次数就是极长不降子段的数量。证明考虑这是一个显然的上界,同时观察到不可能一次缩掉两个段,因此这也是一个下界。对于第二个操作答案就是极长不升子段数量。

根据致远 dp,我们考虑两个操作分开处理,即拆分 \(a_i=p_i+q_i\),答案为 \(p_i\) 的不降子段数量加上 \(q_i\) 的不升子段数量。这很好设计 dp,\(f_{i,j}\) 代表令 \(p_i=j\) 后前 \(i\) 个数的答案,转移:

\[f_{i,j}=\min\limits_{k=0}^{a_{i-1}}f_{i-1,k}+[k>j]+[a_{i-1}-k<a_i-j] \]

直接做是 \(O(n^2)\) 的,类似 slope trick(?),找一些这个 dp 的性质。首先对于某一个 \(f_i\),其本身具有单调性。同时有 \(f_{i,a_i}\le f_{i,0}+2\),因此直接维护 dp 取值相同的三段即可。时间复杂度 \(O(n)\)

CF1383E

找一些性质不难发现等价于可以删去原序列的一些数,其中一个极长全为 \(1\) 的段不能被删空,求能得到多少不同的序列。考虑判定,显然是前缀 \(0\) 匹配前缀 \(0\),后缀 \(0\) 匹配后缀 \(0\),同时对 \(1\) 的段做贪心匹配,在原序列上维护一个类似子序列自动机的东西即可。

AGC043D

vp 的时候被必要不充分条件爆了。

首先一个必要条件是不能存在长度超过 \(3\) 的下降段。然后猜一下长度为 \(2\) 的数量不超过 \(1\) 的数量是充要的,然后直接 dp 就做完了,这题真无敌吧。

AGC043B

无敌的 adhoc。

首先 \(n>1\) 时答案不可能为 \(3\),这显然。同时若第二层存在 \(1\),那么答案不可能为 \(2\)。这样就是一个简单的判定奇偶性的问题了,这真无敌。

AGC043C

无敌的博弈。

首先一定是选尽可能大的,然后观察到可以刻画到博弈上,然后观察到又可以刻画到三场同时进行的博弈游戏上,做完了。。。

nfls P5211

感受出一个 dp,然后刻画成有向图的形式。

nfls P5210

很厉害啊!

首先 \(subtree\) 需要个更好的刻画,这里给出刻画。\(subtree\) 要么是原树的子树,要么是原树去掉一个子树。证明略去。这样有一个 \(O(n^x)\) 的 dp,写的聪明一点可能是 \(O(n^3)\)。考虑我们这样直接记必须要维护和选的点相关的信息。取出重心为根,则显然有当虚树 lca 不为重心 \(r\) 时选的就是原树的子树。这样枚举 lca 直接处理即可。

考虑 lca 为 \(r\)。此时我们就要关心一个极大的、没有点被选的子树有多大。不妨令这个子树大小 \(\le s\),那么我们取出应当有点的、极小的子树(显然两两不交),每个子树内应当至少有一个点,对其容斥。注意此处需要确保虚树的 lca 为 \(r\)

容斥以后的形式是 \(\sum\limits_{S\subseteq A}(-1)^{|S|}\binom{n-\sum\limits_{x\in S}x}{k}\),上指标的范围是 \(O(n)\),因此做一遍背包处理出系数和即可。插入时直接扩充背包,删除时直接撤销背包即可。时间复杂度 \(O(n^2)\)

AGC055C

断断续续做了一晚上,总之做出来了。

首先找一些性质,发现一个序列中只会有 \(p\)\(p-1\) 两种数,将 \(p-1\) 视作 \(0\),将 \(p\) 视作 \(1\),考虑一个 \(01\) 序列能对应多少 \(p\)。首先设 \(0\) 的数量为 \(x\),那么 \(p\) 的下限是 \(x\),这个下限可以被取到,考虑前缀 \(1\) 和后缀 \(1\) 只有一个的时候都是好构造的。若前缀 \(1\) 和后缀 \(1\) 都存在,我们先通过填从 \(n\) 开始的一段后缀把前缀 \(1\) 消去,这样就转化成了刚才的问题。

考虑 \(p\) 的上限。称 \((i,j)=1\) 当且仅当存在 LIS 长度为 \(j\)\(i\) 阶排列,其中需要满足没有数必须被选择。可以感受到的事情是 \((i,i-1)=0\),我们声称:\((i,j)=1\) 当且仅当 \(j\le\lfloor\dfrac{i}{2}\rfloor\)。这是正确的,证明从非必经点成对出现这一角度出发,并不重要。

这样设 \(01\) 序列中每个极长连续 \(1\) 段的长度为 \(a_1,a_2,a_3,\dots,a_s\),则上限为 \(x+\sum\limits\lfloor\dfrac{a_i}{2}\rfloor\),同时根据上面的结论不难发现上下限中的每一个数都能取到,因此该 \(01\) 序列产生的贡献为 \(\sum\limits\lfloor\dfrac{a_i}{2}\rfloor\),但是注意存在 \(m\) 的限制,因此需要稍微改写一下贡献式子:

\[\min(m,x+\sum\limits\lfloor\dfrac{a_i}{2}\rfloor)-\min(m,\max(2,x-1)) \]

注意上述式子在 \(n=3\) 时是错的(可能会有上限 \(<2\) 的序列),需要特判。

经典做法是拆贡献。\(f_{i,j,0}\) 代表考虑完前 \(i\) 个数,贡献总和为 \(j\),当前位是连续 \(1\) 段中第奇数/偶数个数的方案数;\(g_{i,j}\) 代表考虑完前 \(i\) 个数,\(0\) 的数量为 \(j\) 的方案数。转移是简单的,时间复杂度 \(O(n^2)\)。但是交一下会发现在 \(m=n-1\) 的时候是错的,因为我们钦定了 \(p\) 不可以是 \(m+1\),但是整个序列全是 \(p-1\) 的时候,\(p=m+1\) 是正确的,因此将这种情况 \(+1\) 即可。

CF1336E2

首先问题等价于研究线性基,只需要最后乘上 \(2^{n-s}\)。此时若线性基大小小于 \(\dfrac{m}{2}\) 则暴力处理。否则建出正交基,记 \(\operatorname{popcnt}(k)=p\)\(k\) 的数量为 \(occ_p\),其中 \(k\) 要和线性基正交。此时的答案等价于做一次 FWT 后每位除以 \(2^m\)。考虑一个 \(k\) 做 FWT 产生的影响是,对 \(ans_{a+b}\) 做出 \(\dfrac{\binom{p}{a}\binom{m-p}{b}(-1)^a2^n}{2^m}\) 的贡献,有 \(occ_p\) 个,就会乘上一个 \(occ_p\)

posted @ 2025-02-20 15:15  BYR_KKK  阅读(62)  评论(1)    收藏  举报