2023-7-10 #65 我守着虚构的幻想 那些我珍视的模样
——不安琪《失败品》
448 QOJ6669 Mapa
这谁想得到啊??????????????????
插出一个模 1e9+7 下的多项式,保存系数。
449 CF1456E XOR-ranges
感觉挺难的。
类似 406 HDU6358 Innocence,我们将每一段拆成 \(\log\) 个 trie 上的区间,每一个形如“固定前缀 \(S\),长为 \(l\) 的后缀任选”,并将选择 \([l,r]\) 内的数改为在这 \(\log\) 段区间内选择一个。
假设已经完成选择,考虑如何计算答案。从低位到高位扫描序列,假设扫到了第 \(k\) 位。若存在第 \(k\) 位已经确定的数,在对应位置劈开序列,得到的两段仍是形态一致的子问题。否则所有数第 \(k\) 位任选,贡献即“目前区间两端第 \(k\) 位是否相同”(其等价于在笛卡尔树上贪心)。
若没有完成选择,我们沿用上面的结构。记 \(f_{k,i,j}\) 表示考虑到第 \(k\) 位,目前区间是 \([i,j]\) 的答案,转移即:
- 枚举一个位置分段,选择其恰好固定到第 \(k\) 位的一段区间。
- 断言所有数第 \(k\) 位都任选,递归到 \(k+1\) 的问题,并统计对应的贡献。
对于任意区间,其分解出的长为 \(k\) 前缀至多 \(4\) 种,于是复杂度 \(O(n^3k)\),写成记忆化搜索形式比较方便。
450 P7722 [Ynoi2007] tmpq / CF1545F AquaMoon and Potatoes
感觉挺烂的。
首先把题意转换为 \(b_i=a_j=c_k\) 的三元组数量。
根号分治,小的数每次修改后可以暴力 dp,而对前缀和的影响可以使用 \(O(1)-O(\sqrt n)\) 的分块统计。
对于每个大的数单独离线扫一遍序列,问题形如单点修改(总共只有 \(O(n)\) 次),维护前缀信息和,同样地使用 \(O(\sqrt n)-O(1)\) 分块维护即可。
不算难写,复杂度 \(O(n\sqrt n)\)。
451 牛客多校2021 Day3 D Count
枚举被 ban 掉的子集,枚举行列是否被 ban,枚举两条对角线是否被 ban 进行容斥,那么方案数就是剩余的点数选 \(m\) 减钦定掉的点数。
剩余的点数事实上可以表示成没有被 ban 的行数量乘列数量减去一个 \(O(n)\) 的值(修正对角线的贡献),于是我们 dp 行列是否被 ban 做一个背包状物即可,注意 dp 顺序应该是每次剥掉正方形的最外层一圈。
复杂度 \(O(2^kn^4)\)。
452 牛客多校2021 Day3 G Yu Ling(Ling YueZheng) and Colorful Tree
纯 shaber 题。
注意到可以使用 bitset,只需维护一个点的祖先集合,权值 \(\leqslant\) 某值的结点集合,以及某个数的倍数集合。
第一部分直接存空间不太行,树上撒 \(O(w)\) 个点树分块,暴力跳散块改 bitset 空间就是线性了。
第二部分由于有权值相同的情况,不能直接分块,但维护一个分块的结构,根号重构就好了,调一调块长空间也是线性的。
第三部分套路地根号分治一下,倍数数量多就单独给权值开一个 bitset,调调块长空间应该是 \(O(nd(n))\) 的。
复杂度 \(O(nd(n)+\frac{n^2}w)\)。
453 uoj#659. 【ULR #2】Picks loves segment tree IX / AGC061E Increment or XOR
咕咕咕。
454 ARC119F AtCoder Express 3
不知道怎么到银牌的。
从前往后 dp,一个朴素的方法是直接记录最后一个数的类型,以及最后一个 A/B 到源点的最短路,这样是三次方的。
注意到若两维差距大于 \(2\),我们一定不用关心较大的一维(转移一定不优),不妨直接令其对另一维 \(+2\) chkmin。正确性很好说明,考察下一个这种类型字母即可。
复杂度 \(O(n^2)\)。
455 ARC126F Affine Sort
很不错的题目,感觉不止铜牌难度。
令 \(g(c)\) 为固定 \(c\) 时 \(a,b\) 的对数,使用 O'Stolz 定理——
我们将 \(aX_i+b\bmod c\) 写成 \(\frac{aX_i}{c}+\frac bc\bmod 1\),当 \(c\rightarrow\infty\) 时 \(a,b\) 均可看作 \([0,1]\) 内随机实数,于是问题转变为:
称实数对 \((a,b)\) 是好的当且仅当 \(\{aX_i+b\}\) 单增(\(\{x\}\) 是 \(x\) 的小数部分),求二维平面上所有好的实数对 \((a,b)\) 构成的区域的面积。
先考虑如何判定一个 \(a\) 有解,即依次遍历 \(aX_i\) 不会走完一个圆,可以写出,易知其充要性:
若一个 \(a\) 有解,其 \(b\) 的限制也很好刻画——我们只需将原点通过 \(b\) 平移到 \([x_na,x_1a]\) 内。
现在考虑如何找到对应的 \(a\),注意到 \(\{ax\}\) 这个函数关于 \(a\) 是不超过 \(O(x)\) 段的分段一次函数,加起来也只会有 \(O(\sum x)\) 段,而且由于 \(\sum(x_{i+1}-x_i)=0\),每一段都是平的,这就很好处理了。
于是直接排序找到这样的段,对 \(b\) 积分即可,复杂度一个 \(\log\)。
456 U105261 子序列删除问题
最小割模型是经典的,我们求出每个位置为结束/开头的 LIS 长度 \(f,g\),将所有可能在 LIS 中的数取出来,按 \(f_i\) 分层,相邻层之间可以转移的点连边,每个点内部拆点限流 \(1\),最小割即为答案。
我们将每一层按照下标排序,容易发现每个点的后继一定是一段区间(下标限制一段后缀,值限制一段前缀),且一层内的点从前往后区间端点不增。
我们断言,每次贪心地选择一条字典序最小的增广路,且不使用反向边,这样增广出的最大流同样最优。可以通过说明最大流路径不交叉(否则可以调整)来完成证明。
可以暴力模拟这一策略,每次遍历完一个点可以将其删去,因为若成功增广,其内部流量已经流满,否则这个点也无用,于是只需使用并查集找到区间内第一个未删去的点。
最小割的构造考虑一经典方法——从源点开始 dfs。不难发现上述的算法只会增广 \(O(n)\) 条边,我们将这些增广产生的反向边与原图的边放在一起做 dfs 即可,复杂度 \(O(n\log n)\)。
457 AGC056D Subset Sum Game
为啥 hzr 觉得简单啊。
不妨考虑 \(n\) 为奇数的情况,我们枚举 alice 选择的哪一个数并将其删去,一个策略是对剩余的数匹配,bob 取一个数后 alice 立即取其匹配。显然按照值排序相邻匹配最优,此时只需判断是否有奇数位置和加 \(a_i\) 与偶数位置和加 \(a_i\) 在 \([L,R]\) 内。不难证明其同时为下界,上界,于是可以做到 \(O(n)\)。
\(n\) 为偶数的情况是类似的,alice 选择一个数将其忽略并构造一组剩余数的匹配,判定方法与上面相同。此时若 bob 取匹配内的数可以递归到更小的子问题,若 bob 选了空出来的数,alice 可以随便选一个数,剩下的问题仍在我们的考虑之中,直接模拟可以做到平方。
更具体地,我们可以计算出空出来哪个数最优——我们将 \(a_i+\sum a-L-R\) 插入剩余序列,排序后匹配上的数即为最优解,于是可以做到线性。
证明:懒得写了,挂个链接。
458 AGC060D Same Descent Set
为啥 zyf 觉得难啊。
\(2^{n-1}\) 枚举 descent 集合 \(S\),令 \(f(S)\) 为对应的排列数量,即对 \(f(S)^2\) 求和。
使用经典的容斥方法,枚举一个子集 \(T\) 表示我们强制 \(S-T\) 上升,\(T\) 集合内则任意,带 \((-1)^{|S|-|T|}\) 的容斥系数——
转而枚举 \(T_1,T_2\),那么合法的 \(S\) 数量为 \(2^{n-1-|T_1\cup T_2|}\),并集不好刻画,不妨写出 \(2^{n-1-|T_1|-|T_2|+|T_1\cap T_2|}\),枚举其交 \(P\),写出容斥系数时你会发现系数为 \(1\),因为这就是 \(2^{|T_1\cap T_2|}\) 的组合意义,此时问题得到解决。
梳理一下流程:构造一段的 GF \(-\frac 12e^x\),使用 Sequence 构造得到拼接 \(T-P\) 内的 descent 后一段的 GF,将系数平方后再使用 Sequence 构造拼接 \(P\) 内 descent 即可。
只需多项式求逆,复杂度 \(O(n\log n)\)。