做题记录2
做题记录2
字符串(string)
字符串,我爱你。
给定一个字符串 \(S\) 。
第一问:求最小整周期出现次数最多的子串。
第二问: \(m\) 次询问,给定 \(l,r\) 求字串 $ S[l \dots r ] $ 最小整周期的出现次数。
仿照“优秀的拆分”的trick,枚举整周期长度 \(len\) ,每隔 \(len\) 是一个断点,如果最小整周期大于一,那么一定会与断点有交,可以用SA快速判断。
然后根据runs理论,最小周期出现次数大于一的极长子串长度之和为 $ O(n) $ (厉害吧),离线下来跑二维数点。
矩阵(matrix)
网络流,我爱你。
有一个 $ N \times M $ 矩阵 \(A\) ,构造01矩阵 \(B\) 满足:若 $ i+j $ 是奇数且 $ B_{i,j} $ 为1,那么 $ B_{i-1,j-1},B_{i+1,j+1} $ 为0;若 $ i+j $ 是偶数且 $ B_{i,j} $ 为1,,那么 $ B_{i-1,j+1},B_{i+1,j-1} $ 为0。最大化 $ \sum A_{i,j} \times B_{i,j} $ 。
对于一个格点 \(i,j\) ,如果 $ i+j $ 是奇数就向四周对角线的格点连边,边权就是矩阵对应位置的权值。发现形成一个二分图,建出源点和汇点,跑最大费用最大流。信仰一发过了。
冰棒(popsicle)
Ad-hoc,我爱你。
有 \(n\) 个卖冰棒的商店,第 \(i\) 个在第 \(j\) 天卖奶龙味冰棒的概率为 $ p_{i,j\bmod m_i} $ ,对 \(998244353\) 取模 ,也就是说每个商店都有一个固定的周期,在某一天中如果有至少一家店卖奶龙冰棒,不知道谁就会开心,问:在 $ 2025 ! $ 天中开心的天数占比的期望。
$ n\le 3\times 10^3 , m_i \le 100 $
容易注意到只是求个平均概率。
先求不开心的答案,为不卖奶龙冰棒的概率乘积。
思考如果所有周期都互质,那说明商店概率所有可能的组合都会均匀出现,答案就是每个商店求平均值再乘积。
对于更一般的情况,尝试向上述做法转化。周期相同的商店可以直接合并,充分发扬人类智慧,我们把当前日期对 \(M\) 进行一次取模,把模意义下相同的一起计算,那么每个商店的周期变成了 $ \frac{m_i}{ \gcd(m_i,M) } $ 。找到一个 \(M\) 使得每个所有周期变换后不是互质就是相等,最小的一个 $ M=30240 $ 。复杂度 $ O( M m^2 ) $ ,有5组多测,难以通过。事实上,若存在周期的倍数关系,可以把小的循环多次与大的合并,所以我们只用找一个 \(M\) 使得所有周期不是互质就是整除,最小的是 \(2520\) 。
欧内的环(lottop)
给一个平面图,保证每个点度数不小于3,求最小环的大小。 $ n,m \le 5 \times 10^5 $
发现一下性质,注意到答案至多为5。
判一下三元环和四元环就行。证明咕了。
P4737 [CERC2017] Buffalo Barricades
我们先考虑一个弱化问题:询问不是动态的。那么每头水牛都属于至多一个殖民者,离线下来按纵坐标排序扫描线,维护当前在每个横坐标属于的栅栏。对于两个栅栏来说,若存在偏序关系,那么是横纵坐标更小的优先;否则是时间更小的优先。可以用珂朵莉树维护。(目前不会用线段树做,因为标记不能合并)。
回到原始问题,如果一个栅栏包含另一个,我们称它们为父子关系,对栅栏维护并查集,按照时间进行合并,把儿子的答案统计到父亲的贡献。
CF468E Permanent
题意:有一个 $ N \times N $ 的矩阵 \(A\) ,其中有 \(M\) 个位置的值给定,其余位置均为1,求它的积和式,即 $ \sum_{ p = [1 \dots n] } \prod A_{ i,p_i } $ 。
设第 \(i\) 个有值的位置值为 $ w_i $,如果你是一个有经验的选手,你就会发现:
其中 $ { e_1 \dots e_t } $ 是 $ { 1 \dots M } $ 的一个子集,且横纵坐标互不相同。
证明考虑把 $ w_i $ 拆成 $ (w_i-1)+1 $ 不难得证。
由于横纵坐标互不相同,可以注意到这是一个二分图匹配,对于横纵坐标有交的点,我们称它们在同一连通块,对每个连通块分别状压DP,复杂度为 $ 2 ^ { \frac{M}{2} } M $ ,在卡满的情况下是不能通过的。
再考虑另一种做法,构建连通块任意一棵生成树。对于非树边枚举选取情况,对于树边DP,设点数为 \(n\) ,那么复杂度 $ O( 2^{m-n} m^2 ) $ 。两个做法阈值分治平衡一下复杂度就过了。
背包问题模板
有 \(n\) 种物品,分别有 $ a_i $ 件,每件重量为 $ b_i $ ,价值为 $ c_i $ ,做一个容量为 \(m\) 的背包,求最大价值。 $ n,b_i \le 20 , a_i,c_i,m \le 10^{18} $
对物品数量二进制分组,剩下的部分直接拆位,成为 $ O(\log a_i) $ 个新物品,转化为经典问题P3188 [HNOI2007] 梦幻岛宝珠 。
每个物品重量形如 $ b \times 10^k $ ,其中 \(b\) 很小,对每个 \(k\) 分别做背包,最后合并。
设 $ g_{i,j} $ 为对 $ b \times 10^i $ 的物品做容量为 \(j\) 背包 , $ f_{i,j} $ 为做容量为 \(m\) 的背包,在二进制下第 \(i\) 为选择重量为 \(j\) 的物品,最大的价值。
P2482 [SDOI2010] 猪国杀
咱也不知道为什么要写这个。
模拟即可。总的来说并不是很难写,还挺有意思。