SD24一轮省集
前排提醒:
若无特殊说明,模数均为 \(998244353\)。
Day1
D1A
定义 fib 串为:\(S_0=b,S_1=a,S_i=S_{i-1}S_{i-2}\)。
现在给你一个字符串 \(t\),求最短的 \(s\) 满足 \(s\) 是 \(S_{10^{100}}\) 的子串,且 \(t\) 是 \(s\) 的子序列,问 \(s\) 的长度。
\(|t| \leq 1.5\times 10^5\)。
显然的是答案不超过 \(3|S|\)。可以将 \(len_n\) 限制在第一个满足 \(len_{n-4} > 3|S|\),否则可以继续拆分。容易想到双指针。判断一个区间是否合法,考虑像线段树一样的递归结构拆分成 \(\log\) 个完全包含的 fib 串。注意到需要再预处理 \(f_{i,j}\) 表示从 \(S\) 的第 \(i\) 个字符开始,用 \(fib_j\) 能匹配到的位置,可以倍增预处理。最终复杂 \(O(n \log n)\)。
D1B
有 \(n\) 条线段,每条线段为在 \((l_i,h_i)\) 到 \((r_i,h_i)\) 之间。并且在每条线段上⾯ \((\frac{l_i+r_i}{2}, h_i+0.5)\) 处有个水龙头。
打开一个水龙头后,水会按照现实世界中的物理规律流动并覆盖某些线段,在线段边缘处水会落下。
现在你想按随机顺序打开这些水⻰头,每次你都会在所有没水的线段中,随机选取⼀个它对应的水⻰头打开。
问期望打开多少个,所有的线段上才会有⽔。
\(n \leq 5\times 10^5\)。保证 \(l_i,r_i\) 两两不同,且构成 \(1 \sim 2n\) 的排列。
先转化为随机顺序染色,如果已经被染过则跳过。若已知有 \(f_i\) 个线段开始染色能染到 \(i\),则答案为 \(\sum \frac{1}{f_i}\)。模拟这个过程相当于初始 \(l=l_i,r=r_i\),往上枚举若有交更新区间。若被当前区间 \(h_i\) 完全包含则退出。\(h_i\) 可以通过求能到达当前点的 \(\max r_j\) 得出,建图也是容易的。现在相当于求若干个矩形的并里有多少条线段,求出上方第一个包含 \(l_i\) 的线段和包含 \(r_i\) 的线段,差分配合倍增即可。
D1C
有 \(n\) 个数,第 \(i\) 个数是在 \((0,2^{a_i})\) 内随机的实数,问 \(a_1,a_2,...,a_n\) 中没有一个超过总和一半的数的概率。
\(n \leq 5\times 10^4, a_i\leq 50\)。
首先大于一半的数只能有一个,所以可以对于每个数都求一遍然后加起来。相当于求 \([x_i > \sum_{j\not=i} x_j]\) 的概率。然后朴实无华但细想一下非常震撼的是 \(2^{a_i}-x_i\) 的分布显然与 \(x_i\) 的分布相同,就可以转化为 \(\sum_{j}x_j < 2^{a_i}\) 的概率。
套路地,将整数与小数部分拆开。现在我们要计算的是 \(n\) 个在 \([0,1]\) 之间均匀随机的实数加起来不超过 \(x\) 的概率 \(P_x\)。 根据 Irwin–Hall distribution:
感性理解一下,首先容斥有几个超出上界的数。现在相当于求 \(n\) 个随机的实数加起来 \(\leq x\) 的概率。这等价于一个前缀和数组 \(p\) 使得 \(p_n \leq x\) 的概率,这是一一对应的。相当于随机在 \([0,x]\) 中撒 \(n\) 个点,有 \(n!\) 种撒点顺序可以对应一种前缀和方案,所以有上述结论。
接下来只需要将小数部分合并到整数部分上即可。
那么将 \(p_x-p_{x-1}\) 作为 dp 数组的初值,从低位往高位做 dp,每次枚举当前位置有几个 \(1\),这相当于一个卷积。最终复杂度 \(O(an\log n)\)。
设 \(f_{i,j}\) 表示 \(i\) 子树到叶子路径上有 \(j\) 个黑点,转移形如 \(f_{i,j} = \min(c_{i,x}+\sum f_{v,j-x}) (x \in \{0,1\})\),易证 \(f\) 是凸的,set 维护差分数组,长剖合并 dp 数组即可。
设 \(f_{i,j}\) 表示只考虑 \(i\) 子树,当前联通块大小为 \(j\)
的方案数。直接枚举 \(f_{i}\) 内的非 \(0\) 项转移即可。复杂度为 \(O(n^{1.5})\)。证明的话若 \(k \leq n^{0,5}\) 显然,否则可以得到子树内至多有 \(\frac{n}{k}\) 个连通块,对当前联通块大小的影响至多为 \(\frac{n}{k}\),所以非 \(0\) 项依然只有 \(O(n^{1.5})\) 个。
若 A,B 分开处理最后再合并是没有前途的。设 \(f_{i,j,k}\) 表示处理到 \(A_i,B_j,sA_i-sB_j=k\) 的概率。根据 \(k\) 的正负来转移,保证 \(k\) 时刻 \(\in [-W,W]\)。复杂度 \(O(n^2W)\)。
- \(O(nW)\) 子集和
给定 \(n\) 个在 \([1,W]\) 内的整数,判断能否选出一个子集使得总和为 \(x(x\leq nW)\)
思想同上,再进行一些单调性的分析就能做到。先咕了。
容易想到设 \(s\) 为前缀和,\(f_{i,j,k}\) 表示前 \(i\) 个,\(\max_{s}=j,s_i=k\)。套路地想到如果倒着做就不用记录 \(s_i\)。设 \(f_{i,j}\) 表示考虑了后 \(i\) 个,\(\max_s=j\)。转移时 \(j=\max(0,j+a_i)\)。但问题是每次从 \(i\) 往前重新计算 \(i\) 的前缀的答案依然会超时。注意到 dp 本质上是计算一个 DAG 上起点到终点的带权路径和。所以再倒着做即可 \(O(n^2)\) 解决。
Day2
D2A
有一个数组 \(a\),可以反转⾄多 \(K\) 个数的符号,问可能的最⼤的前缀和。
对 \(K=1\sim n\) 求出答案。
\(n \leq 2\times 10^5, |A| \leq 10^9\)。
感觉一下,反转 \(i\) 个数的最优前缀的位置应当是不降的,因为随着区间的变长可以反转更多数。类比决策单调性使用主席树快速计算代价即可。复杂度 \(O(n\log^2n)\)。
upd 2024.4.6:这跟 ABC348G 是一个题,难绷。同机房老哥试图抢一血失败了,更难绷了。
D2B
有⼀个 \(01\) 串 \(s\),A,B 两人轮流操作。A 先⼿。每一次操作如下:
-
A 在 \(s\) 中找到两个位置 \(i,j(i\lt j)\),满⾜ \(s_i=0,s_j=1\),然后将 \(s_i,s_j\) 删除。
-
B 执行跟 A 一样的操作。
当⼀个人无法操作的时候,游戏结束。当前轮不计入游戏轮数。
A 想要最大化游戏轮数,B 想要最小化游戏轮数。两个⼈都按最优策略,最后的游戏轮数是多少。
多组数据,\(T\leq 20, |s| \leq 10^5\)。
将 \(0\) 看作左括号,\(1\) 看作右括号。先考虑如何判定给定的长度为 \(4n\) 的字符串在两人的操作下可以被完全消除。
Bob 的目的是让字符串变得不合法,所以他的最优策略就是每次删掉第一个 \(0\) 和最后一个 \(1\)。建出括号树后,如果当前层有多个分支(即当前层是若干个合法括号串拼起来),则 Alice 需要选择一个分支递归下去,并将其他分支全部消除,不然就会被 Bob 破坏。否则 Bob 的操作次数 \(+1\)。那么进行的每一步都要求 Alice 需要的操作次数小于等于 Bob 的操作次数。至此容易 \(O(n)\) 判定。
解决原问题,先二分答案 \(x\),然后贪心地取出 \(S\) 中前 \(2x\) 个左括号和后 \(2x\) 个右括号,判定能否被完全消除即可。复杂度 \(O(n \log n)\)。
D2C
定义 \(f(a,x)\) 为将数组 \(a\) 划分为若干段,使得每一段的 xor 都 \(\not= x\),能划分出的最多段数,若不存在合法划分则值为 \(0\)。
给定 \(n,K,x(x \lt 2^K)\),问若 \(a\) 中每个数都是在 \([0,2^K-1]\) 中随机的整数,则 \(f(a,x)\) 的期望是多少。
\(n \leq 10^6, K \leq 60\)。
先特判 \(x=0: ans=n\times \frac{2^k-1}{2^k}\)
将除了 \(x,0\) 之外的数定义为好数字 \(a\)。段数的贡献有以下几种情况:
- 一个 \(a\) 划分为一段:\(ans=n\times \frac{2^k-2}{2^k}\)
- 整个序列只有 \(0,x\):考虑异或前缀和数组 \(s\),除了 \(s_n=s_0=0\),其他项等概率取 \(0,x\)。\(ans=\frac{1}{2}(1+\frac{n-1}{2})(\frac{2}{2^k})^n\)
- 前/后缀是 \(x,0\):枚举长度 \(n\)。\(ans=\sum_{i=1}^{n-1}2\times(\frac{2}{2^k})^{i} \times \frac{2^k-2}{2^k} \times \frac{i}{2}\)
- 两个 \(a\) 之间夹着若干个 \(x,0\):枚举长度 \(n\),相当于 \(\max(cnt0,cntx)-1\)。即:\(\sum_{L=1}^{n-2}(\frac{2^k-2}{2^k})^2(\frac{1}{2^k})^L (n-L-1)\sum_{i=0}^{L}\binom{L}{i}\max(i,L-i-1)\),根据 \(\binom{n}{i}i=\binom{n-1}{i-1}n\) 化简即可。
复杂度 \(O(n)\)。
\(f_{i,j}\) 表示前 \(i\) 个 \(j\) 条没选的最大收益。转移形如 \(f_{i,j}=f_{k-1,j-1}+val(k,i)\)。使用线段树可以做到 \(O(n^2\log n)\)。注意到相当于每次进行前缀加,询问全局最大值。前缀最大值的段只会发生合并,使用并查集维护所在段以及前缀最大值的差分数组即可做到 \(O(n^2 \alpha(n))\)。
判断两个串的编辑距离 \(\leq k\) 可以想到设 \(f_{i,j}\) 表示匹配 \(s[1...i],t[1...j]\) 最小代价。注意到 \(|i-j| \leq k\) 的状态才有意义,且 \(f_{i,j}\) 具有单调性,改写状态为 \(g_{a,b}\) 表示修改 \(\leq a\) 次,\(i-j=b\) 时最大的 \(x\) 使得 \(f_{x,x+b} \leq a\)。转移需要预处理两个串后缀的 lcp,复杂度易做到 \(O(k^2)\)。对于每个后缀都做一次 dp,总复杂度 \(O(nk^2)\)。
设 \(f_i\) 表示最大值序列最后一项为 \(i\) 的方案数。转移分两种。
-
祖先 \(u\) 转移到后代 \(v\),这要求 \((u,v)\) 这条路径上 \(u\) 是次大值。
-
无祖先后代关系,设 \(x\) 为 \(u,v\) 的 lca,则 \(u\) 在 \(x\) 的这个方向的子树里是最大值,且 \((x,v)\) 上只有 \(v\) 比 \(u\) 大。
将满足 \((rt,u)\) 这条路径上最大值为 \(u\) 的点称为关键点,显然最大值序列里只会有关键点出现。
于是第一个转移容易优化,只需向子树内相邻的关键点转移即可。
对于第二种转移我们希望找到一种更简单的转移顺序,单纯从 \(1,2,3,...,n\) 顺着转移要维护奇怪的树上形态。所以不妨从树的结构本身入手。对于节点 \(u\) 的儿子,按照子树内最大值从小到大转移,搜完 \(u\) 的所有子树,就先删去 \(u\) 的儿子的子树最大值的贡献,再将 \(u\) 子树的最大值 \(w\) 的贡献加入到树状数组内。对于关键点 \(x\),设 \(fa_x\) 为最深的关键点祖先,那么能贡献到它的点的权值应在 \([val_{fa_x}+1, val_x-1]\),树状数组查询区间和即可。
复杂度 \(O(n\log n)\)。
容易写出一个 \(n^2\) dp:\(f_{i,j}\) 表示第 \(i\) 个 \(a\) 最后在第 \(j\) 个位置,转移是容易的。
考虑最后答案应该是形如:BBB...ABAB...BBB...BABA...,所以尝试一段一段去转移。\(f_{i,0/1}\) 表示当前段结尾为 \(i\),字符为 \(A/B\) 的最少次数。
难点在于 ABAB/BABA 段的转移,注意到 ABAB...段 的 A、B 数量相同,设 A 为 \(-1\),B 为 \(1\),\(s\) 为前缀和数组。则对于 \(s_{j-1}=s_i, f_i=\min(f_{j-1}+calc(j,i))\)。\(calc(j,i)=|a_{p_1} -a_j|+|a_{p_2}-a_{(j+2)}|+....\),问题在于绝对值不好拆开。注意到若对于一段 ABAB...,\(|a_{p_x}-a_{(j+2(x-1))}|\) 的符号改变了,因为符号变化一定经过 \(0\),这意味着可以分成前后两半,使得两半的 A、B 的数量都相同。所以只需要找到前面第一个满足 \(s_{j-1}=s_i\) 的位置转移即可,此时绝对值的符号都相同,容易计算贡献。
复杂度 \(O(n)\)。
设初始排列为 \(a\),剩余的排列为 \(b\),前缀最大值位置数组为 \(c\)。不妨先考虑若给定 \(b,c\) 如何求字典序最小的 \(a\)。令 \(p_i\) 表示第 \(i\) 个 \(1\) 是最大值的最大前缀。从前往后填,首先从小到大填上当前段空缺的 \(0\),若 \(1\) 是空缺的,再从剩下的数里找到能成为 \([1,p_i]\) 最大值的最小的数填到 \(1\) 上。
所以能变成 ? 的 \(0\) 的权值应该单调不降。
根据 \(0\) 的条件,能得出一个 \(1\) 的位置 \(i\) 能变成 ? 的充要条件是,设 \([1,p_i]\) 中的次大值为 \(h_i\),则 \([h_i+1,a_i-1]\) 中的数不能有变成 ? 的。
因为 \(0\) 的限制更容易维护,所以设 \(f_{i}\) 表示最后一个变成 ? 的 \(0\) 权值为 \(i\),转移:\(f_i=f_j+cost(i,j)\),\(cost(i,j)=2^{sum_x[j \leq h_x \& a_i<i]}\),注意到不同 \(1\) 的 \([h_x,a_x]\) 互不相交那么长度总和为 \(O(n)\) 级别,所以每次加入新的 \(1\) 的区间计算贡献变化时,先整体乘 \(2\),再将不合法的改回去即可做到 \(O(n\log n)\)。
咕咕咕咕咕。
从前往后做无疑是没有前途的,因为要记录的信息太多,当前能放入总量为 \(j\) 的仓库个数看起来是无法消除的。
考虑从后往前做。
设 \(a_i\) 为第 \(i\) 个仓库初始的数量,\(a_i'\) 为第 \(i\) 个仓库操作完前 \(i-1\) 个仓库后的数量。
若当前仓库 \(i\) 满足 \(a_i'=b_i\),
咕咕咕咕咕。
\(m \leq 50000\),所以只能做背包加入不能做合并。考虑 dfs 时需要记录祖先信息的原因是在回溯时,回溯到的祖先的其他儿子不知道祖先的状态。考虑 dfs 当前子树时,先枚举当前点的状态并记录下来往轻儿子 dp,这样往重儿子 dp 时就不用记录当前点的状态。所以复杂度为 \(O(nm 2^{\log n})\)。
咕咕咕咕咕。
咕咕咕咕咕。
Day3
D3A
给定有向图 \(G=(V,E)\),定义一个合法的生成子图为:
- 是内向基环树森林
- 所有简单环的环长均为奇数:(环长即为环中包含的点数)。
定义一个有 \(k\) 个奇环的合法生成子图的权值为 \(2^k\),求 \(G\) 的所有合法生成子图的权值和 \(\bmod P\) 的结果。
\(|V| \leq 500, |E| \leq 2\times 10^5, 1 \leq P \leq 10^9\),\(P\) 不一定为质数,可能存在重边,自环。
显然这种题都是凑个系数然后跑矩阵树定理。试一下就能发现
\(A+D\) 跑出来的结果就是对的。然后就完了。
不过我们还是来证明一下。这个的证明还是有点意义的。
行列式的值是 \(\sum_{p}(-1)^{inv(p)} \prod a_{i,p_i}\)。考虑对于一个固定的 \(p\),\(p_i=i\) 意味着这个点的出边任选,否则意味着钦定选择 \((i,p_i)\) 这条边。同时 \(p\) 中每当有钦定一个偶环,权值乘上 \(-1\),否则不变,因为交换 \(p_i,p_j\) 时,如果 \(i,j\) 不在一个环里会合并,否则分裂。而形成一个偶环需要交换奇数次 \(p_i,p_j\),每交换一次逆序对的奇偶性都会改变,奇环的证明同理。
对于一个有 \(x\) 个奇环,\(y\) 个偶环的方案,它会被计算:
这正好就是我们想要的结果。得证。
D3B
初始有一个矩阵 \(M=\left[ \begin{array}{l} 1 & 0 \\ 0 & 1 \end{array} \right]\)
给定 \(a,b,c,d\) 和偶数 \(u,v\)。你可以执行以下 \(4\) 种操作:
- 花费 \(a\) 的时间,\(M\leftarrow M\times \left[ \begin{array}{l} 1 & u \\ 0 & 1 \end{array} \right]\)
- 花费 \(b\) 的时间,\(M\leftarrow M\times \left[ \begin{array}{l} 1 & -u \\ 0 & 1 \end{array} \right]\)
- 花费 \(c\) 的时间,\(M\leftarrow M\times \left[ \begin{array}{l} 1 & 0 \\ v & 1 \end{array} \right]\)
- 花费 \(d\) 的时间,\(M\leftarrow M\times \left[ \begin{array}{l} 1 & 0 \\ -v & 1 \end{array} \right]\)
问在不超过 \(n\) 的时间里,能生成多少种不同的矩阵 \(M\)。
多组数据,\(T \leq 5, 1 \leq n \leq 10^{12}, 1\leq a,b,c,d \leq 700, 1\leq u,v \leq 10^0, 2 \mid u,v\)。
不妨将 \(4\) 个矩阵设为 \(A,A^{-1},B,B^{-1}\)。
大胆猜测,除去 \(uv=0\) 的情况,即 \(u\geq 2,v\geq 2\) 时,对于一个操作序列 \(A^{p_1}B^{p_2}A^{p_3}...\),只要两个操作序列的 \(p\) 数组不同,最后得到的结果也就不同。证明要用一些神秘的构造向量,我不会。
然后用 BM 跑出表达式后直接常系数齐次线性递推即可。
很显然,我不会 BM,也不会常系数齐次线性递推,所以我摆了。
D3C
给定一个 \(n\) 列的由 \(1\times 1\) 方格组成的图形,第 \(i\) 列的高度为 \(h_i\)。问用不超过 \(3\) 个矩形能覆盖的最大面积。
\(n, h_i \leq 5\times 10^5\)。
构式题,不补。
Day4
D4A
定义:
给定质数 \(P\),多组询问,每次给定 \(n\),求 \(f(n) \bmod P\)。
多组数据,\(T \leq 10^5, 1 \leq n \leq 10^7, 10^8 \leq P \leq 2^{30}\),保证 \(P\) 为质数。
不妨枚举 \(k-m\):
考虑从 \(f(n-1)\) 推到 \(f(n)\),注意到有:
考虑右边这个式子的组合意义,对于一条向左走 \(x\) 步,向上走 \(n-x\) 步的折线,它的贡献是
所以可以写成:\(\sum_{i=0}^{n}\binom{n}{i}\binom{n+1}{i}=\binom{2n+1}{n}\)。
所以 \(f(n)=2f(n-1)+\binom{2n+1}{n}\)。可以 \(O(n)\) 递推。
讲题人还有一个抽象至极的双射的证明,先咕了。
D4B
一个箱子里有 \(n\) 个球,每次随机摸出一个球并放回箱子里。所有球至少被摸到 \(1\) 后结束。若此时恰好被摸过 \(1\) 的球的个数为 \(X\),给定 \(M\),对于 \(m=1\sim M\) 求出 \(X^m\) 的期望。
多组数据,\(1 \leq n \leq 10^5, 1 \leq M \leq 200, 10^8 \leq P \leq 2^{30}\),保证 \(P\) 为质数。
套路地,\(x^m=\sum_{i=1}^{m}\) \(m \brace i\) \(\binom{x}{i} i!\),\(\binom{x}{i}\) 相当于钦定了 \(i\) 个只选 \(1\) 次的球。所以设 \(f_{i,j}\) 表示已经摸过 \(i\) 个球,摸过的球里钦定了 \(j\) 个只摸一次的。第二维大小是 \(O(m)\),转移是容易的。复杂度 \(O(nm)\)。
D4C
题面:洛谷 P8182
看到一段区间整体减一容易想到差分。对于位置 \(i\),若差分数组 \(s_i>0\) 相当于可以选择 \(x \in [i+1,i+m],s_x\rightarrow s_x+s_i\),贪心选最近的。容易做到 \(O(qn)\)。很遗憾这没有前途。
若序列不降可以每次选择第一个 \(a_i>0\) 的位置,将 \([i,i+m-1]\) 都减去 \(a_i\)。否则对于 \(a_i>a_{i+1}\) 的位置,因为肯定存在 \(a_i-a_{i+1}\) 个操作的右端点在 \(i\)。那不妨提前对 \([i-m+1,i]\) 减去 \(p_i=\max(0,a_i-a_{i+1})\)。预处理之后,可以将问题转化为每次可以选择不大于 \(m\) 的区间整体减一,使得 \(\forall a_i \leq 0\) 的最少次数。设 \(q_i\) 为 \(p_i\) 的前缀和
但是对于询问 \([l,r]\),在 \(r\) 之后的预处理可能会改变答案。不过预处理后的序列在消除完 \([l,r-m]\) 能保证 \([r-m+1,r]\) 是不降的,那么答案就是 \([l,r-m]+a_r+q_{r-m}-q_{l-1}\)。
设 \(b_i\) 为要进行多少次 \(i\) 为左端点的操作。那么有:
设 \(s_i\) 为 \(b_i\) 前缀和。
\(s_n\) 即为答案。容易发现 \(s\) 的组合意义为选择一个集合 \(S\),使得 \(\forall i,j \in S,|i-j| \geq m\),最大化 \(\sum_{x \in S} a_x\)。
对于 \(m \leq n^{0.5}\),类似猫树,处理距离分治中心不超过 \(m\) 的位置开始的前/后缀的答案,询问时直接拼起来即可。
对于 \(m> n^{0.5}\)。对于当前分治区间,至多有 \(n^{0.5}\) 块,所以若存在一个块被完全跳过且被询问区间部分包含,可以通过 \(O(n^{1.5})\) 预处理得到答案。否则可以分讨,至多递归到一边。
前面忘了,中间忘了,反射容斥即可做到 \(O(n)\)。
对于一个给定的划分,值域为 \([1,m]\),其半标准杨表的个数为:
后面不会了捏。
将相邻三个点当作三角形的三个中点,把所有三角形画出来后,限制相当于,选择一个点就将与它相连的两个三角形匹配,不能重复匹配,这显然是等价的。然后就转化为了 P8114。
Day5
D5A
给定一个 \(n\times n\) 的矩阵 \(a\),\(01\) 矩阵 \(b_{i,j}\) 有 \(a_{i,j}\) 的概率为 \(1\),\(1-a_{i,j}\) 的概率为 \(0\)。问矩阵 \(b\) 的积和式大于 \(0\) 的概率。
\(n \leq 7, 0\leq a_{i,j} \leq 1, a_{i,j}\) 至多有两位小数。
容易发现积和式不为 \(0\) 等价于存在完美匹配。考虑霍尔定理,对于一个不存在完美匹配的边集,试图找出一个代表性的左部点子集 \(S\),使得 \(|S|-|G(S)|>0\)。那么令 \(|S|-|G(S)|\) 最大的子集为代表,若有多个选 \(|S|\) 最小的。可以证明这是唯一的。
若有多个,设左侧点集分别为 \(A,B\),右侧点集为 \(G(A),G(B)\),易得 \(|G(A\cap B)| \leq |G(a) \cap G(B)|\)。那么有:
那么显然,\(A\cap B\) 和 \(A\cup B\) 中一定有一个更优的。所以唯一。
由上面的证明,可以得知容斥时只需要枚举 \(S/S1\) 的子集。可以做到 \(O(3^{2n})\)。
具体的,设 \(h1_{s,s1}\) 表示 \(s1\) 中的每个点至少有一条来自 \(s\) 的边的概率,\(h2_{s,s1}\) 表示 \(s,s1\) 之间无边的概率。\(f_{s,s1}\) 表示 \((s,s1)\) 是代表子集的概率 \((|s|>|s1|)\),\(g_{s,s1}\) 表示 \(s,s1\) 之间满足霍尔定理的概率。
转移时乘上 \(g\) 是为了保证 \((x,y)\) 是代表子集。不然一定可以扩大 \(s-g(s)\)。
这个做法指出了霍尔定理中的“代表子集”,感觉还是很有用的。
另外一个做法是按行 dp,注意到我们只关心前 \(i\) 行能否符合排列 \(p\) 的前 \(i\) 项,设 \(f_{i,s}\) 表示前 \(i\) 行,能匹配的状态为 \(s\),粗略估计 \(s\) 是 \(2^{\binom{n}{\frac{n}{2}}}\) 的,不过实际上有效的状态只有 30000 多种。转移是容易的,总复杂度 \(O(n2^nT)\),\(T\) 是状态总数。
D5B
给定一棵 \(n\) 个点,以 \(1\) 为根的二叉树。
现在你要往某些节点上放球,球被放入之后会自动向叶子方向下落。具体来说,一个球在树上的
下落规则是:
- 如果当前位置是叶子或者所有儿子上都有球,则停止下落。
- 如果恰有一个空儿子,则落到那个空儿子上。
- 如果有两个空儿子,且球不是从更上层落下来的,则会在两个儿子上等概率随机选一个下落。
- 如果有两个空儿子,且球是从上一层落下来的,则球会落到和当前下落方向相同的儿子上。(也就是说,如果当前位置是上一层的左儿子,那么就还是落到左儿子;右儿子同理。)
一个球被放入之后会一直下落直到当前位置是叶子或者所有儿子上都有球为止。
现在你有 \(k\) 个球,其中第 \(i\) 个球必须放在 \(p_i\),且你每次放置一个球后必须等待停止下落后才能放下一个,但你可以任意决定这 \(k\) 个球的放入顺序。如果放 \(i\) 号球的时候 \(p_i\) 已经有球了,那么就不能放了。
问:在所有 \(k\) 个球都能成功放入的前提条件下,有多少种可能的不同的最终结果。
\(n,k \leq 5000, 1\leq p_i \leq n\)。
一开始读错题导致没做出来,最唐氏的一集。
考虑子树内部放的球的总数是固定的,所以设 \(f_{i,j}\) 表示 \(i\) 的子树内接受了子树外传来的 \(j\) 个球的方案数。转移分只有一个儿子和有两个儿子讨论。细节就不放了,还是很简单的。
D5C
给定 \(n\) 个一类点 \((a_i,b_i)\),同时每个一类点还有权值 \(c_i\)。再给定 \(m\) 个二类点 \((x_i,y_i)\)。设 \(d(i,j)\) 为 \(i,j\) 这两个点的曼哈顿距离。将一类点标号为 \(0\sim n-1\),二类点标号为 \(n \sim n+m-1\)。
建图:
- 对于一类点 \(i\),\((s,i,1,c_i)\)。
- 对于二类点 \(j\),\((j,t,1, -1\times d(n+j,n+(j+1)\bmod m))\)
- 对于一类点 \(i\),二类点 \(j\),\((i,n+j,1,d(i,j))\)
问流量为 \(1 \sim n\) 时,费用最大是多少。
\(n,m \leq 10^5, |a_i|,|b_i|,|c_i|,|x_i|,|y_i| \leq 10^9\)。
曼哈顿距离转切比雪夫距离,一个经典套路是绝对值可以拆成若干个值取 \(\max\)。所以可以拆 \(9\) 个点表示不同的符号,转化为快速求 \(11\) 个点的图的费用流,搞 \(18\) 个 pq 维护即可。
Day6
D6A
给定两个串 A,B。有以下两种操作:
- 在 A/B 的开头/结尾加字符,
- 询问此时 B 在 A 里出现几次。
操作完后 \(|A|+|B| \leq 10^6\),操作 \(2\) 的次数 \(\leq 10^6\)。
太过经典的串串题。离线后SAM+线段树合并+倍增即可轻松切掉。不过在线版本非常厉害,先咕了。
D6B
给定一颗树 \(T\) 和整数 \(k\)。定义 \(T\) 的一个点分治树 \(D\),其必须满足:
- \(D\) 的节点 \(u\) 的每个子树都满足:子树内的所有点在原树 \(T\) 中对应的点形成一个连通块,且这个连通块在 \(T\) 中跟 \(u\) 相邻。
- \(D\) 的每个点 \(i\) 有一个层级值 \(h_i\),是一个正整数,且满足 \(1 \leq h_i \leq k\)。
- \(D\) 中父亲节点的层级值总是严格小于孩子节点,也就是说 关于 \(h\) 是一个小根堆。
请你求出 \(T\) 可能的不同的 \(D\) 个数。
\(n \leq 50, k \leq 17\)。
比较经典的结论是对于一个层数标号序列 \(h\),若满足 \(\forall i,j,h_i=h_j\),\(i\) 到 \(j\) 的路径上存在 \(k,h_k<h_i\) ,则存在唯一对应的点分治树,构造还是很容易的。
那容易写出 dp:\(f_{u,s}\) 表示 \(u\) 的子树内某个点 \(v\),使得 \(v\) 到 \(u\) 的路径上不存在小于 \(h_v\) 的点,\(h_v\) 的集合为 \(s\) 的方案数。转移时枚举当前子树根选择的数 \(i\),然后对于儿子的状态 \(f_{v,s}\),将比 \(i\) 更高的位清 \(0\),然后 \(3^k\) 做子集卷积即可。
但是这样会 TLE,在做子集卷积时,枚举非 \(0\) 位更少的数组转移,就能乘上 \(\frac{1}{2}\) 的常数,可以通过。
D6C
给定两个有 \(n\) 个点的图 \(G,H\)。
然后在 \(G,H\) 中分别选出一个生成森林 \(F_G,F_H\),定义这种选法的权值为 \(F_G\) 中边权最大值和 \(F_H\) 中边权最大值相加。
定义两个数 \(u,v\) 可达,当且仅当在 \(F_G\) 中 \(u,v\) 连通,或者在 \(F_H\) 中 \(u,v\) 连通。
问:\(1\sim n\) 形成的 \(\binom{n}{2}\) 个点对中,至少有 \(k\) 对点对是可达的前提下,权值最小是多少。
\(n \leq 2\times 10^5,\) 边权 \(w\leq 10^9, k \leq \binom{n}{2}\)。
设一个点在第一个树中所在的连通块为 \(a_i\),第二个树中所在连通块为 \(b_i\)。对边权排序后,显然可以双指针,此时相当于 \(O(n\log n)\) 次单点修改,询问 \([a_i=a_j \cup b_i=b_j]=1\) 的 \((i,j)\) 个数,容斥一下变成:《\(a_i=a_j\)》+《\(b_i=b_j\)》- 《\(a_i=a_j\) 且 \(b_i=b_j\)》,前两项容易维护,第三项开 \(n\) 个 map 维护即可。复杂度 \(O(n\log^2n)\)。
实现过程中不用写启发式分裂,直接开一个栈存下每次的变化,同时记录操作完前 \(i\) 条边后对应的栈顶,然后倒着扫过去即可。
Day7
D7A
有 \(n\) 个宠物在进行宠物对战,每只宠物是水、火、佬、菜四种属性之一。
属性克制关系如下:
- “水”和“火”互相克制
- “佬”分别克制“水”“火”“菜”三种属性
- “佬”“水”“火”三种属性都克制“菜”
- 其它上述没有提到的都不克制
现在每个宠物的属性未知,给定 \(m\) 对 \((u,v,w)\),表示 \(u\) 是否克制 \(v\)。找出一组合法的解。
\(n\leq 10^5, m\leq 5\times 10^5, 1 \leq u,v \leq n, w \in \{0,1\}\)。
设 \(a_i,b_i\) 表示 \(i\) 的权值。令佬、水、火、菜的权值分别为 \((1,0),(1, 1), (1,1),(0,1)\),那么 \(i\) 克制 \(j\) 可以写成 \(a_i \geq a_j ,b_i \leq b_j\)。这是一个 2-sat 的形式,容易解决。当然,更好写的方法是,通过 \(1\) 边将点分为水/火、佬/水/火、菜/水/火、佬/菜/水/火,\(a_i,b_i\) 之间的关系可以通过 \(0\) 边,进行一次 bfs 后得到,然后对水/火的点进行二分图染色即可。
D7B
给定长为 \(n\) 的排列 \(p,q\),你可以选择 \(p\) 中任意一个长度为 \(m\) 的连续段,将其插入到 \(p\) 中的任何位置(包括开头结尾),问能否在 \(n^3\) 次操作内使得 \(p=q\)。
多组询问,\(T \leq 10, 1 \leq m\leq n \leq 100\)。
神秘构造题。
先特判 \(m=n,m=n-1\)。
操作的本质是拿出一个长度为 \(m\) 的区间插入到任意位置。考虑这个过程中逆序对的变化量,可以得到当 \(m\) 是奇数时可以得到所有排列,\(m\) 是偶数时可以得到奇偶性一样的排列。
\(m\) 是奇数:构造出相邻对换即可。
\(m\) 是偶数:无法构造相邻对换,但是可以构造出三个元素的互换:\(ABC \rightarrow CAB\)。
构造思路大概是先将要对换顺序的串移到开头,在开头处完成对换,再将前面的操作逆回去。具体过程就不放了。
D7C
给定 \(n\) 个点。
接下来在 \(\binom{n}{2}!\) 种顺序中等概率选择一种,然后依次对所有的点对尝试加边。
每次尝试加边 \((u,v)\) 的时候,只有加边前 \(u,v\) 的度数至少一个等于 \(0\) 时,才加入这条边。
请求出尝试完所有点对后,连通块个数为 \(k\) 的概率。对素数 \(P\) 取模。
\(2 \leq n \leq 10^7, k\leq n, 9\times 10^8 \leq P \leq 10^9,\) \(P\) 为素数。
连通块的个数=\(\sum\) 加入当前边时,\(deg_u=deg_v=0\)。
那么枚举这样的边的个数,然后二项式反演得到答案即可。
\(n\) 个点的图里选出 \(m\) 个匹配的方案是:\(\binom{n}{m}(2m-1)!!\),每次选择最小的点的匹配点,所以有后面那个双阶乘。
接下来考虑形成这 \(m\) 个匹配的条件是什么。不妨先钦定一个出现顺序,最后再乘上 \(m!\)。首先是匹配中的点 \(i\) 连向不在匹配中的 \(n-2m\) 个点的边,应该晚于 \(i\) 的匹配边。两个匹配 \((u_i,v_i),(u_j,v_j)\) 之间的边,因为已经钦定了 \((u_i,v_i)\) 出现早于 \((u_j,v_j)\),所以钦定这些边晚于 \((u_j,v_j)\) 即可。
不妨将这刻画成“树的拓扑序”个数,那么最后形成的树应该是形如先连出一条链,表示匹配边之间的关系,链上每个点再连上若干点,点数就是上文讨论的,钦定晚于当前边的边数。
根据树的拓扑序个数为 \(n!\prod\frac{1}{siz_i}\),可以得出匹配合法的概率为:
整理一下,我们就可以得到答案了:
Day8
D8A
给定 \(n\) 个整数 \(a_i\)。问有多少个子集 \(s\) 满足
- \(s\) 中所有数的按位与等于 \(0\)。
- 不存在 \(s\) 的非空真子集 \(t\) 使得 \(t\) 中所有数按位与等于 \(0\)。
多组询问,\(1\leq T\leq 30, 1 \leq n\leq 100, 0 \leq a_i \lt 512\)。
为了方便先转化为所有数或起来是全集。接下来考虑如何快速判定一个集合是否为极小正交集合。
一个比较显然的思路是维护前缀或和后缀或,然后容易想到如果对于每个数都存在某个二进制位只有它自己为 \(1\),称这样的二进制位是当前 \(i\) 的"独特位",那就是极小正交。搜一下合法状态数大概是 \(5e6\) 种,不能通过。
考虑对于“不存在独特位的集合”进行容斥,系数为 \((-1)^{|S|}\),转移时先求出对于当前位置 \(i\) 的独特位,若钦定 \(i\) 在集合里,则将这些独特位设为之后必须再被覆盖至少 \(1\) 次即可。复杂度 \(O(Tn3^{\log_2 A})\)。
D8B
给定一棵 \(n\) 个点的树,再给出 \(m\) 条路径 \((u,v)\) 以及权值 \(w\)。有 \(q\) 次询问,每次询问树上一条路径 \((u,v)\),\(m\) 条路径中跟 \((u,v)\) 有交的 \(w\) 之和是多少。
\(n,m,q \leq 5\times 10^5, w \leq 10^9\)。
两条路径的交显然还是路径,所以点减边容斥,然后求个 lca 就做完了。
D8C
有 \(n\) 个人,每个人有权值 \(b_i\),其中 \(n-1\) 个人的权值为 \(x\),另外一个人的权值为 \(x+y\),\(x,y\) 为任意正实数。
可以进行 \(m\) 轮操作,每轮操作将人分成 \(A,B\) 两个组,同时给每个人赋值整数 \(a_i \in [0,k]\)。\(S_A = \sum_{i\in A} a_ib_i,S_B=\sum_{i\in B} a_ib_i\),你可以得到 \(S_A-S_B\) 的值。
在所有的测试开始之前必须制定好每次测试的参与人员和题目数量,而不能在得知前面测试结果后调整后面的测试方案。
现在你想要知道最大可能的人数 \(n\),使得 \(x,y\) 是什么值,你都可以通过测试保证正确找到哪一位的权值为 \(x+y\)。
当人数固定时,在制定方案前你只知道 \(n,m,k\)。
多组询问,\(1 \leq T \leq 10, 1 \leq m,k \leq 10^5\)。
这相当于对于每个人赋上一个权值在 \([-k,k]\) 之间的大小为 \(m\) 的向量,设第 \(i\) 个向量的第 \(j\) 个位置上为 \(c_{i,j}\)。对于任意 \(0 \lt x, 0\lt y\),令权值为 \(x+y\) 的人是 \(u\),我们要想办法区分在这种情况下的 \(\forall j \not= v, c_u,c_v\)。每次的测试结果相当于告诉我们 \(s_i = xf_i + yg_i\) 的值,经过化简,一定可以得到类似于 \(\frac{s_i'}{s_j'} = \frac{c_{u,i}}{c_{u,j}}\) 的形式,那么只要满足 \(\exist i,j, \frac{c_{u,i}}{c_{u,j}} \not= \frac{c_{v,i}}{c_{v,j}}\) 即可区分 \(c_u,c_v\)。当然,我们还可以通过 \(s_i\) 的正负号来区分 \(c_u,c_v\)。
不妨先将 \(c_{i,1},c_{i,2},...,c_{i,m}\) 都除掉最大公约数。那么现在转化为求,长度为 \(m\),值域在 \([-k,k]\),且 \(\gcd\) 为 \(\pm1\) 或全 \(0\) 的序列个数,可以发现这样的条件是充要的。
那答案的形式的就很明朗了,套用莫反即可得到:
柿子中的 \(\pm 1\),是为了计算上当前位置为 \(0\) 的方案或者去除全 \(0\) 方案。

浙公网安备 33010602011771号