【A】杂题选将
P13617 [ICPC 2024 APC] Bit Counting Sequence
考虑进 1 位导致位数和减 1,那么我们找到进位最多的那一次,那么他应该是形如 111..000..0 的一个东西,然后你去判定一下就好了。
P11818 [PA 2019 Final] 一安在? / Gdzie jest jedynka? 2
考虑维护 \(\gcd\) 最大的整数对 \((p_x,p_y)\),一开始 \(x=0,y=1\),每次加入 \(i\)。分类讨论:
- \(\gcd(p_x,p_i)>\gcd(p_x,p_y)\),令 \(y\) 等于 \(i\)。
- \(\gcd(p_x,p_i)<\gcd(p_x,p_y)\),不变。
- \(\gcd(p_x,p_i)=\gcd(p_x,p_y)\),有 \(\gcd(p_i,p_y)\ge \gcd(p_x,p_y)\),令 \(x\) 等于 \(i\)。
可以证明,0 一定能够保留到最后。
那么首先用 \(p_x\) 和其他判断一遍 \(\gcd(p_i,p_x)\),若出现过 2 次 1,则说明 \(p_x\) 不是 0。那么用 \(p_y\) 继续判断剩下的即可。复杂度 \(3n\)。
考虑到上面分讨需要重新查询 \(\gcd(p_i,p_y)\),那么若 \(\gcd(p_x,p_y)>1\) 则打标记最后不再查询,若 \(\gcd(p_x,p_y)=1\),则不重新查询 \(\gcd(p_i,p_y)\)。复杂度 \(2n\)。
P11820 [PA 2015] 健身房 / Siłownia
若不存在 \(r_i\) 相同且 \(p_i\) 相同的要求,考虑这样一个贪心:
按照时间 \(t\) 扫描线,对每个 \(p_i\) 维护一个 set。
- 首先加入所有 \(l_i=t\) 的需求。
- 若存在某个人 \(r_i=t\) 且在 set 中,考虑在这个时刻尽量满足一些需求:对于每个 \(p\) 找出 \(r\) 最小的那个,在 \(t\) 时刻满足他的需求。
考虑存在 \(r_i=r_j,l_i\le l_j\),令 \(r_i\) 减一即可,考虑这样做尽量满足了合法性。按照 \(l\) 倒序插入,然后维护 \(r\) 的连续段即可。
P13407 [GCJ 2010 Finals] Letter Stamper
即最小化入栈次数。
不妨令我们当前想要打印 A:
- 栈大小为 0:插入
A。 - 栈大小为 1:若不存在
A,则插入A。 - 栈大小为 2:若不存在
A,则插入A;否则弹出直到栈顶为A。
考虑栈顶从右往左依次是:
A:喵。AB:弹出B。ABC:那我们并不知道应该弹出还是插入,考虑 dp。
那么根据讨论,不应该出现两个 A 之间相隔 0/1 个字符的情况。故栈应该长成 ABCABCABC... 的形状,那么枚举 ABC 的排列,然后做一个 \(O(n^2)\) dp 即可。
P11803 【MX-X9-T7】『GROI-R3』此花绽放之时
考虑对于每个极大颜色连通块的根作为代表元,每次给他打上一个 \((col,val)\) 的标记。然后你发现修改之前你改变了颜色,原本祖先链上未下放的标记可能被破坏。考虑对于 \(u,v\) 他们的整个祖先链进行标记下方,记作 \(\operatorname{pway}(u),\operatorname{pway}(v)\)。
考虑对每种颜色开一棵动态开点线段树维护每个位置的 tag。然后考虑树剖+维护轻儿子,每次对于重链中一个点 \(u\) 他的极长 dfn 同色连续段进行下放标记,然后用树状数组维护和。\(\color{#9966FF} \mathtt \Gamma\)
但是你看轻子树,他的 tag 被下放情况不太对。考虑用 map 记录 \(s_{u,c}\) 表示 \(u\) 从父亲那里继承了多少的 \(col=c\) 的标记。
然后修改颜色操作就做完了,其他两个操作是简单的。总复杂度 \(O(n\log ^2n)\)。
P13863 [SWERC 2020] Decoration
将 \(x\) 的唯一出边 \(x+d(x) \bmod n\) 连边,这是个内向基环树森林。即要求一个长度为 \(k\) 的不重复路径。每个点作为起点模拟即可。
uoj187 https://uoj.ac/problem/187
对于 \((i,j)\) 满足 \(b_i\ge b_j,|a_i-a_j|\le b_i-b_j\),我们称其为可达的一对点。考虑 dp,枚举 \([j,i]\) 都接到,\((k,j)\) 都没接到,则有 \(f_i=f_k+(i-j+1)^2\),要求 \(k\) 可达 \(j\),\([j,i]\) 这段点每个点都可以达下一个点。
将转移分为两部分转移,考虑 \(|a_i-a_j|\le b_i-b_j\),即要求 \(a_i-a_j\le b_i-b_j\) 且 \(a_j-a_i\le b_i-b_j\),则有一个二维偏序,由于 \(b_i-b_j\ge 0\) 成立才能转移,相当于已经满足了 \(b_i\ge b_j\) 的限制。那么按照其中一维排序,维护另一维的最小值。
第二部分显然是一个斜率优化。将极长的可达连续段取出来变成序列上跑这个东西即可。
P12602 指鹿为马
考虑 kmp 自动机,有 \(f_n=0\),求 \(f_1\)。
\(f_i=1+\sum_c f_{\delta(i,c)}p_{s_i,c}+[\delta(i,c)=0]p_{s_i,c}(E_{s_i}+f_1)\),其中 \(E_{s_i}\) 表示从 \(s_i\) 开始生成,一直生成到 \(s_1\) 的概率。
转移存在环,但是这个增广矩阵比较稀疏。第 \(i\) 行只有 \(\le i+1\) 的列是非零常数。将 \(i+1\) 这一项放在右边,则左侧是三角矩阵,相当于已经高斯消元好了。考虑用 \(k_if_1+b_i\) 表示出所有的 \(f_i\),解一元方程即可。
P13350 「ZYZ 2025」遗传
显性和隐性是类似的,将患病情况取反即可。下面讨论显性。
考虑求出固定一个生物的患病情况,然后求出整体合法的概率,再除以不固定生物的整体合法概率(就是条件概率)。
每次只有一个点到根的路径上的转移不同,其他可以预处理,由于随机数据树高并不大,可以 \(O(nh)\) 过掉。
P12462 [Ynoi Easy Round 2018] 星野爱久爱海
首先考虑暴力。对 \([l,r]\) 建出虚树,那么我们一定是想要尽量选择叶子。不妨令在点集 \(S\) 中选择 \(k\) 个点的最优方案为 \(F(S,k)\)。
做过 Spiders Evil Plans 可以得到一个策略:首先枚举直径端点作为根,长剖,每次选择最长的链即可,选 \(k-1\) 次。
然后我们可以证明 \(F(S\cup T,k)\subseteq F(S,k)\cup F(T,k)\),若不满足这个的话可以用不在右边的那条链更新右侧的其中一者。
那么支持 \(O(k\log k)\) 合并,考虑数据结构维护。
按照 \(k\) 分块,块内暴力,块间 st 表合并,复杂度大概是 \(O((n\log n+qk)\log k)\),\(\log k\) 可以通过将合并优化到 \(O(k)\) 进行加速,瓶颈大概在排序?
也可以上线段树,多一个 log。
浙公网安备 33010602011771号