Atcoder试题乱做 Part6

锦瑟无端五十弦, 一弦一柱思华年.

尝试做完所有 \(\text{ABC}\)\(\text{Ex}\) .

计划从一开始就破产了, 不会 \(q-analog\) 和群论, 寄了.


\(\text{[AGC020D]Min Max Repetition}\)

\(\color{green}{\text{[EASY]}}\)

首先考虑连续相同的最大值最小是多少, 显然是 \(k=\max\{\lceil\frac{a}{b+1}\rceil,\lceil\frac{b}{a+1}\rceil\}\) , 考虑如何构造出这个串, 其一部分贪心填 \(A\) 后一部分贪心填 \(B\) , 同时不超过 \(k\) 的限制.

那么我们可以二分这两个边界的位置, 满足右边 \(b\leqslant ak\) , 这样可以满足我们的构造, 输出的时候分两段判断即可.

时间复杂度 \(\mathcal{O}(q\log{(A+B)}+q(D-C))\) .


\(\text{[ABC212H]Nim Counting}\)

\(\color{green}{\text{[EASY]}}\)

\(Nim\) 游戏的结论是 \(a_1\oplus a_2 \oplus \dots \oplus a_m \not= 0\) 则先手必胜.

这题实际上就是, 我们可以根据 \(a\) 数组得到一个集合幂级数, \(F(x)=\sum\limits_{i=1}^{n}{x^{a_i}}\) .

然后我们需要计算 \([x^{\varnothing}]\sum\limits_{i=1}^{n}{F^i}\) , 计算先手必胜和先手必败是一个道理, 考虑怎么计算 \(F^k\) , 直接对 \(F\)\(FWT\) , 然后把每一项 \(k\) 次方再 \(IFWT\) 回去.

又有 \(FWT(A+B)=FWT(A)+FWT(B)\) , 所以如果要计算 \(F^u+F^v\) , 就先对 \(F\)\(FWT\) 再对每一项算出其 \(u\) 次方加 \(v\) 次方, 在 \(IFWT\) 回去.

回到原题就是每一项变成 \(F\dfrac{1-F^n}{1-F}\) , 时间复杂度 \(\mathcal{O}(n\log{v}+v\log{v})\) .


\(\text{[ABC214H]Collecting}\)

\(\color{green}{\text{[EASY]}}\)

一个点双的明显可以一次性全到, 缩点之后变成一个 \(DAG\) .

考虑从 \(i\) 走到 \(j\) , 必须满足 \(i\) 的拓扑序在 \(j\) 之前, 同时它会失去 \(i+1\sim j-1\) 的所有物品的价值, 所以可以记前缀和, 将每个点拆成两个点 \(in,out\) 跑网络流.


\(\text{[ABC213H]Stroll}\)

\(\color{green}{\text{[EASY]}}\)

\(f_i(x)\) 表示从点 \(1\) 到点 \(i\) 的所有路径权值积之和, 故有 \(f_{u,i}\leftarrow f_{u,i}+\sum\limits_{d=1}^{T}{[x^d]g_ef_{v,i-d}}\) , 即 \(f_u(x)\leftarrow f_u(x)+g_e(x)f_v(x)\) .

按分治 \(NTT\) 的想法对时间分治做就行, 时间复杂度 \(\mathcal{O}(mT\log^2{T})\) .


\(\text{[ABC218H] Red and Blue Lamps}\)

\(\color{green}{\text{[EASY]}}\)

问题可以转变成初始颜色全部相同, 可以改变 \(x\) 个颜色, 改变一个位置 \(i\) 获得 \(a_{i-1}+a_i\) 的贡献, 改变位置不能连续, 经典反悔贪心.


\(\text{[ABC215H]Cabbage Master}\)

\(\color{green}{\text{[EASY]}}\)

不难想到 \(Hall\) 定理, 考虑最少的取球数怎么算, \(Min = \max\{0,\min\{\sum\limits_{i\in T}{a_i}-\sum\limits_{N(i)\in T}{b_i}+1\}\}\) , 其中 \(T\) 是颜色集合, \(N(i)\) 表示和盒子集合 \(i\) 有连边的颜色集合.

考虑答案怎么算, 设集族 \(S=\arg{\min\limits_T\{\sum\limits_{i\in T}{a_i}-\sum\limits_{N(i)\in T}{b_i}+1\}}\) ,枚举颜色集合 \(T\) , 答案为 \(\sum\limits_{T\in U}{[\exists A\in S,T\in A]f(T,Min)}\) .

其中 \(f(T,c)\) 表示在集合 \(T\) 中取出 \(c\) 个球, 其中每个颜色都必须要取一次的方案数, 考虑容斥 \(f(T,c)=\sum\limits_{P\in T}{(-1)^{|T|-|P|}\dbinom{\sum\limits_{i\in P}{a_i}}{c}}\) .

把枚举子集的地方换成 \(FWT\) 即可, 时间复杂度 \(\mathcal{O}(2^nn)\) .


\(\text{[ABC216H]Random Robots}\)

\(\color{blue}{\text{[NORMAL]}}\)

把模型转化一下, 走 \(x\) 轴不变, 每个时间都让 \(y\) 轴加 \(1\) , 变成类似 \(LGV\) 的模型, 类似的想到容斥, 记录最终序列从左到右为 \(P\) , 答案即为

\[\sum_{P,Q}{(-1)^{\sigma(P)}(\frac{1}{2})^{nk}\prod_{i=1}^{k}{\binom{n}{q_i-x_i}}} \]

考虑状压来模拟 \(P\) 的形成, 设 \(f_{S,j}\) 表示从左到右已经排入排列的数的集合, 最靠右的最终位置 \(\leqslant j\) 的带权方案数, 转移很简单

\[f_{S,j}=f_{S,j-1}+\sum_{i\in S}{(-1)^{d(S,i)}f_{S\setminus i,j-1}\binom{n}{j-x_i}(\frac{1}{2})^n} \]

时间复杂度 \(\mathcal{O}(2^kkn)\) .


\(\text{[ABC217H]Snuketoon}\)

\(\color{blue}{\text{[NORMAL]}}\)

不会 \(slope\;trick\) , 靠这题学习了一下.

首先考虑暴力 \(dp\) , 设 \(f_{i,j}\) 表示 \(T_i\) 时刻在 \(j\) 位置总共受到的最小伤害, 转移 \(f_{i,j}=\min\limits_{k=j-len}^{j+len}\{f_{i-1,k}\}+|j-X_i|[(j>X_i)=D_i]\) , \(len=T_i-T_{i-1}\) .

\(f_{i,j}\) 看成关于 \(j\) 的函数, 不难发现是一个线性分段下凸函数, 线性分段很显然, 简单证明下凸.

考虑归纳证明 \(f_{0,j}\) 显然成立, 考虑一次转移, 转移方程的后半部分的图像只有两种形态, 均为下凸的, 前面的 \(\min\) 函数也是下凸函数, 两个下凸函数相加, 得到的还是下凸函数, 证明分别对两个函数求二阶导即可.

这启示我们用 \(slope\; trick\) 优化, 大致是说用一个点集和一条直线来描述并维护一个凸壳, 这里只写下凸壳.

我们分别维护凸壳斜率为 \(0\) 的区间两侧, 每个集合维护相同.

对于凸壳上的一个点 \(s_i\) , 如果他两端斜率不一样, 就把它加入点集, 设两边斜率差为 \(p\) , 那就加入 \(p\)\(s_i\) 的横坐标, 最后由一段无限延伸的直线组成, 所以一个点集中的元素表示斜率在该坐标上恰好改变了 \(1\) , 多个相同元素就是变化大于 \(1\) , 容易发现一个一次函数和点集可以描述一个斜率为整数的凸壳.

设凸壳 \(C_1,C_2\) 的集合为 \(S_1,S_2\) , 直线分别为 \(l_1,l_2\) , 则合成的凸壳 \(C=C_1+C_2\) 的集合为 \(S=S_1\cup S_2\) , 一次函数为 \(l=l_1+l_2\) 这里的加法为斜率相加, 截距相加.

于是就可以很方便的转移了.

回到这题, 一次转移本质上是将凸壳左侧向左平移 \(len\) 个单位, 右侧向右平移 \(len\) 个单位, 这可以直接通过打 \(tag\) 实现, 分类讨论加入拐点即可, 时间复杂度 \(\mathcal{O}(n\log{n})\) .


\(\text{[ABC221H]Count Multiset}\)

\(\color{green}{\text{[EASY]}}\)

挺有意思的, 没有个数限制的时候就是拆分数, 转移的时候容斥掉开头恰好有 \(m+1\)\(1\) 的情况就行了, 设 \(f_{i,j}\) 表示和为 \(i\) , 序列长度为 \(j\) , 转移为 \(f_{i,j}=f_{i-1,j-1}+f_{i-j,j}-f_{i-j,j-(m+1)}\) .

时间复杂度 \(\mathcal{O}(n^2)\) .


\(\text{[ABC220H]Security Camera}\)

\(\color{green}{\text{[EASY]}}\)

数据范围明显是分成两个集合 \(S,T\) 之后操作, 设 \(L(s)\) 表示左边选择点集为 \(s\) 时边数的奇偶性, \(R(t)\) 表示右边选择点集为 \(t\) 时两端都在 \(T\) 中的边数的奇偶性, \(G(s)\) 表示 \(T\) 中与 \(\{S\setminus s\}\) 有奇数条边的点的集合.

显然答案就是,

\[\sum\limits_{s}{\sum\limits_{t}{[L(s)\oplus R(t) \oplus (\operatorname{popcount}(G(s)\cap t)\& 1)=0]}} \]

\(f(s) = \sum\limits_{t}{R(t)\oplus (\operatorname{popcount}(G(s)\cap t)\& 1)}\) , 则当 \(L(s)=1\) 时贡献为 \(f(G(s))\) , \(L(s)=0\) 时贡献为 \(2^{|T|}-f(G(s))\) .

考虑如何计算 \(f(s)\) , 注意到 \(\operatorname{popcount}(G(s)\cap t)\& 1\)\((-1)^{|G(s)\cap t|}\) 类似, 也就是和 \(FWT\) 的系数类似, 考虑套用 \(FWT\) , 只需加上总方案数 \(2^n\) 再除以 \(2\) 即可.

时间复杂度 \(\mathcal{O}(n2^{\frac{n}{2}})\) .


晚夜微雨问海棠, 言尽泪绝荡回肠.

posted @ 2023-02-15 16:56  Lonely923  阅读(66)  评论(0编辑  收藏  举报