做题笔记23
11.8
P9419 [POI 2021/2022 R1] Układanie kart
记第一个数为 \(x\),我们的操作一定是 \((x-1,x-2,\cdots,1,n,n-1,\cdots,1)\),观察发现后面 \((x-1,x-2,\cdots ,1)\) 的操作是比较好算的,此时原排列变成了一个单位排列的循环位移,每次都让最后一个数往前挪,则贡献为 \((x-1)(n-1)\),那么总贡献就是 \(\sum_{x=1}^{n}(x-1)(n-1)(n-1)!=\binom{n}{2}(n-1)(n-1)!\),现在考虑计算前半部分 \((x-1,x-2,\cdots ,1,n,n-1,\cdots,x)\),这时候所有的位置我们都会操作一遍,于是可以考虑给其重标号,每次将编号最小的移到最前面,且最开头的编号最大,拆贡献,对于每一个位置,其操作时相对于原来的位置会增加后面已经操作过的,且编号比它小的,也就是逆序对数,而计算逆序对我们也可以考虑贡献,对于任意一对 \(i<j<n\),其恰有一半的情况是 \(i\) 在 \(j\) 后面,于是每一对的贡献可以看作 \(\frac{1}{2}\) 其贡献就是 \(\frac{1}{2}\binom{n-1}{2}\times n!+\binom{n-1}{2}\times n!=\frac{3}{2}\binom{n-1}{2}\times n!\),后面那个东西是因为要加上原来的位置,再加上最开头的数的贡献,即 \(n!\times (n-1)\)
还要去掉没有进行 \((n,n-1,\cdots,1)\) 的,每个贡献都是 \(n(n-1)\),一共有 \(\sum_{i=1}^{n}A(n-1,i-1)\),这个东西可以递推,记为 \(f_{n-1}\),有 \(f_{n}=nf_{n-1}+1\)
复杂度线性,由于不能算逆元,前面有些 \(n!/2\) 可以预处理出来 \(n\times(n-1)\times\cdots\times 3\)
P8326 [COCI 2021/2022 #5] Fliper
首先把每一个原图中的环找出来,有解的一个必要条件是任意环长都是 \(8\) 的倍数,观察一下限制,很容易往欧拉回路去想,关键就是怎么建图,回想一下欧拉回路,其每个点的出度和入度都是偶数,而在这道题中的限制是每个环中点的颜色,于是我们可以把点看成边,把环看成点,假如所有的连通块都是合法的环,我们可以找到每个障碍,对其两边的环连边,先跑一边欧拉回路玩玩,你会严肃发现,此时对所有边进行了黑白染色,而所有点的黑白色的边的条数都是 \(4\) 的倍数,于是可以再对黑色和白色的边集分别跑欧拉回路进行二染色,这样我们就构造出了答案
对于不是环的连通块,可以搞一个超级源,若其度数不是 \(8\) 的倍数,可以补一些自环
复杂度线性对数,瓶颈在于排序建图
CF1750G Doping
数钦定 \(k\) 段的答案,记作 \(g_k\),有
可以反演到 \(f\),由于要字典序更小,枚举 lcp,假如 lcp 为 \(i\) 数 \(p'_i<p_i\) 的方案数,记 \(c_0\) 为数轴上,\(p_i\) 左边有多少连续段,\(t_0\) 为有几个空可以插,\(c_1,t_1\) 同理 ,考虑选了 \(k\) 段,枚举左边具体插了几个板,其方案为
后面 \((k-1)!(c_1+j)\) 是因为需要满足 \(p'_i<p_i\),这是个喜闻乐见的范德蒙德卷积,推一下式子
当 \(p'_i=p_{i-1}+1\) 时,方案为
每个 \(i\) 都反演一遍显然有点浪费,于是我们可以从后往前推,再把固定的连续段记上,记 \(f_{i,j}\) 为考虑了 \([i,n]\),钦定了 \(j\) 的方案,则有转移
- \(f_{i+1,j}+f_{i+1,j-1}\rightarrow f_{i,j}\),若 \(p_i=p_{i-1}+1\),可以钦定当前分段或不分段
- \(f_{i+1,j-1}\rightarrow f_{i,j}\),只能分段
最后在 \(f_{i,j}\) 处加入 \([i,n]\) 选 \(j\) 的答案即可,复杂度平方
CF1693F I Might Be Wrong
可以说明 \(cnt_0=cnt_1\),不妨设整个序列满足 \(cnt_0\ge cnt_1\),否则我们可以反转序列,此时操作 \(cnt_0<cnt_1\) 肯定不优,那不妨设我们操作的满足 \(cnt_0-cnt_1=d\)
- 若操作子串开头为 \(0\),我们可以不管他,此时 \(d'=d-1\)
- 若操作子串开头为 \(1\),我们可以找到一个满足 \(cnt_0=cnt_1\) 的前缀,操作他,这时候序列的开头变成 \(0\) 了,此时 \(d'=d-1\),花费了 \(1\) 的代价
所以我们可以花费至多 \(1\) 的代价递归子问题,结论得证
直接贪,找到极长的满足 \(cnt_0=cnt_1\) 的前缀,将其操作,然后删掉前缀 \(0\),重复这个过程,直到序列变得 \(cnt_0<cnt_1\),这时候我们补上前面已经操作掉的一些 \(0\) 再操作一次即可
CF1477D Nezzar and Hidden Permutations
如果有某个点连了 \(n-1\) 条边,其 \(p\) 和 \(q\) 必定相同,我们可以说明,若某个点的度数不为 \(n-1\),必然存在一种方案,使得每个度数不为 \(n-1\) 的点都有 \(P\ne Q\)
你都考虑 \(n-1\) 了,可以想到要考虑其反图,此时所有连通块大小 \(\ge 2\),如果剩下的是一个菊花,我们可以给根赋值 \((1,n)\),剩下的点赋值 \((i,i+1)\) 就能构造了,若有更多的连通块,可以让连通块之间完全偏序,这样就完美解决了问题,如果我们能把每个连通块,都划分成点数 \(\ge 2\) 的菊花,那么就一定容易构造出来一组解了,于是考虑把反图划分成点数 \(\ge 2\) 的菊花,考虑拉出来任意一个生成森林,我们在这个生成森林上构造
如果当前点的父亲是菊花的根,我们不妨让其接到父亲下面,否则,若当前点不是叶子,可以让当前点当根,那只剩下了当前点是叶子且其父亲不是菊花的根的情况,如果其父亲所在菊花大小 \(>2\),可以把它父亲从原来那个菊花上摘下来,然后与当前点构成一个菊花,如果其父亲所在菊花大小 \(=2\),可以让它父亲作为其菊花的根,然后接上去,这样还是合法的
现在任务就是找到反图的生成森林,用一个 set 维护,每次取出一个还没被加入到森林中的点,然后把 set 中和当前点没边的都删了并连上反图中的边,重复这个过程
复杂度线性对数
P10574 [JRKSJ R8] 暴风雪
记 \(t_{u,i}\) 为 \(u\) 子树内,\(dep_i\) 的点的权值和,有结论,当 \(i\) 固定时,对于一条到根链,其 \(t_{u,i}\) 的改变只有 \(\mathcal{O}(\sqrt n)\) 次,因为若 \(u\) 在上升到 \(v\) 过程中,若想改变 \(t\) 的值,必须满足 \(u\) 子树内存在一个,不在 \(v\) 子树中长度为 \(dep_i-dep_v\) 的链,由于 \(dep_v\) 单调递增,所以最多只有 \(\mathcal{O}(\sqrt n)\) 个这样的 \(v\)
如果我们能找到分段就起码能做到低于 \(\mathcal{O}(n^2)\) 了,可以先阈值分治一下,对于修改点 \(x\) 祖先中和它距离不到根号的点,直接暴力找,超过根号的点可以预处理,而“另一棵子树”这种东西很让我们往链剖分上去考虑,每条重链上,维护出超过根号的点,对于每个点,记 \(w_{u,i}\),为其轻儿子中距离其为 \(i\) 的点的权值和,这个东西总大小是线性对数的
现在考虑所有分段点的贡献,当我们跳轻链时,无法区分轻重,需要手动求子树内某层的和,这个东西可以每层开个维护 dfn 序的树状数组,否则,直接加上 \(w_{u,dep_{x}-dep_{u}}\) 就好了
直接树剖线段树有点浪费,对于每一条重链的贡献,形如若干个 \((l,r,v)\),你发现,所有分段点距离操作点的总和为 \(\mathcal{O}(n)\),那么有结论,对于 \(\sum a_i=\mathcal{O}(n)\),有 \(\sum \log (a_i-a_{i-1})=\mathcal{O}(\sqrt n)\),我们只需要取出所有有用的区间做,复杂度就是对的,找到这些区间的话,可以考虑直接用 zkw 线段树维护,你从下面往上跳的时候,遇到已经遍历过的节点就不往上跳了,这样就能取出所有对的区间,或者把操作用队列存下来,在 dfs 线段树的时候再判断是否需要当前区间
结论证明,记 \(b_i\) 为 \(a\) 的差分数组,\(b\) 的大小为 \(m\),将 \(b\) 翻转,原命题就是 \(\sum b_i\times i=\mathcal{O}(n)\Rightarrow \sum \log (b_i)=\mathcal{O}(\sqrt n)\),考虑均值不等式有 \(\frac{n}{m}\ge \frac{\sum b_i\times i}{m}\ge \left(\prod b_i\times i\right)^{1/m}\),即 \(\prod b_i\le\frac{\left(\frac{n}{m}\right)^m}{m!}\),两边取对数得到 \(\sum \log (b_i)\le m\log n-m\log m-\log(m!)\),用 \(\log m\) 的积分去近似 \(\log (m!)\),就能得到 \(\sum \log (b_i)\le m\log n-m\log m-(m\log m-m)=m(\log n-2\log m+1)\),求导后去掉常数项是 \(\log n-2\log m\),所以 \(m=\sqrt n\) 的时候大概是最大的,结论得证
P12264 『STA - R9』咏叹调调律
屎!?
发现所有子序列中,\(C\) 都是在左边,\(B\) 都是在右边,而 \(A\) 的位置比较自由,于是我们可以把 \(C\) 看作左括号,\(B\) 看作两个右括号,在 \(AB\) 中,\(A\) 可以作为两个左括号,在 \(CA\) 中,\(A\) 可以看作一个右括号,所以可以暂时把 \(A\) 看作问号,做一个括号匹配
当然,如果我们知道了哪些位置填 \(A\),这些位置肯定是 (( 在前面,) 在后面,于是存在一个 (( 和 ) 的分界线,且只存在一个这样的分界线,但是我们发现 \(AABC\) 就寄了,此时括号可能会存在 (()()),于是考虑让 ) 优先去匹配 ((,如果剩下了一个 (,其只能和 ) 匹配,否则如果碰到了一个 )),可以考虑反悔
于是记 \(f_{i,j,k,0/1,0/1/2}\) 表示前 \(i\) 个,有 \(j\) 个 (,\(k\) 个 ((,是否在分界线,是否存在匹配了一半的 ((,如果存在还要存 (( 被匹配一半之前,其前面还有没有空的 (,直接转移即可,复杂度 \(\mathcal{O}(n^3)\)
P13559 【MX-X15-T6】翻树树
阈值分治,对于 \(deg>B\) 的点,翻过去再翻回来,对于 \(deg\le B\) 的点,每次翻转一个叶子,那么最劣的 \(S\) 是 \(\left\{1,2,3,\cdots,B-1,B,B+2,B+4,\cdots ,B+2k\right\}\),则 \(S\) 合法当且仅当 \(\sum_{i\in S}(i-1)\le n-2\),则有 \(\binom{B}{2}+Bk+k^2\le n -2\),可以解一个 \(k\) 的范围,反正最后能算出来是对的

浙公网安备 33010602011771号