May Cook-Off 2021 Division 1

May Cook-Off 2021 Division 1

Double Burgers

Permutation Swaps

((i,p_i)) 连边,维护每个环即可(略)

Falling Zero

简单地用栈维护一个从根到叶子的dp即可(略)

Product Mex Queries

先进行一些分析。假设区间中只有质数的次幂,质数 (p) 能拼出次幂的指数的 (mex)(W_p),那么答案为 (min{p^{W_P}})。既然答案是质数的次幂,那么加入不是质数次幂的数,显然于事无补,由此得到结论:有用的数只有质数的次幂。

答案的宽松上界为第 (n+1) 个质数,那么我们维护每一种质数能拼出哪些指数,由于答案有上界,指数的上界为 (log V)

方案Ⅰ:直接使用回滚莫队,用 (bitset) 维护可行性,用 (\_Find\_first()) 函数快速计算 (mex) 值,若用 (set) 维护答案多出 (log),可改用分块平衡去掉,复杂度 (O(frac{nsqrt{n}log V}{w}+nsqrt{V}))(sqrt{V}) 似乎有些大了,但其实可能的答案只有 (le V) 的质数次幂,数量略多于 (n),把这些可能值离散后再分块复杂度为 (O(frac{nsqrt{n}log V}{w}+nsqrt{n}))

方案Ⅱ:将 (R) 从左往右移动,记录 (f_R(x)) 表示右端点在 (R),至少要区间 ([f_R(x),R]) 才能拼出 (x)。考虑加入 (R+1),若 (A_{R+1}) 不是质数的幂次就别管,否则假设 (A_{R+1}=p^k),我们只要更新 (p^c)(f_{R+1}(p^k·p^c)=min(f_R(p^k·p^c),f_R(p^c))),别忘了更新 (f_{R+1}(p^k)=R+1)。然后用线段树维护 (f_R) 的区间最值,在线段树上二分即可得到答案。复杂度 (O(nlog^2V/nlog nlog V))

XOR maximum-minimum matrices

(2^n) 枚举用了那些行,我们只需要每列的最小值和最大值,问题转化到序列上了。对于最小值和最大值分别维护一个单调栈,每次加入/删除的时候 (O(1)) 计算答案的变化量。假设选了 (cnt) 行,那么序列上的一种方案世纪对应 ((n-cnt+1)·cnt!·(n-cnt)!) 种,乘上去就好了。要先离散化预处理。复杂度 (O(nmlog (nm)+2^nm))

原文地址:https://www.cnblogs.com/whx666/p/15102782.html