day4
AGC061C. First Come First Serve
应先考虑去重,而两个选择的顺序相同,当且仅当存在 \(i\) 使得 \((a_i,b_i)\) 范围没有选。
那么对于这种情况,钦定优先 \(a_i\),那么对于选 \(b_i\) 的点,当且仅当 \((a_i,b_i)\) 范围有点时合法。
对这个容斥,钦定 \(a_i/b_i\) 系数为 \(1\),钦定 \(b_i\) 且不合法系数为 \(-1\)。
不合法会影响到一个 \((L_i,R_i)\) 里的 \(j\),讨论一下发现这个区间如果出现重了的话方案不合法,故不用考虑。
可以写出一个 \(\mathcal{O}(n)\) 的 dp。
P11427. 绝顶之战
对成功放入的集合 \(\mathrm{S}\) 进行判定。
只需求能满足条件的最大 \(m\),然后判断是否超过给定的 \(m\)。
设立 \(f(\mathrm{S},\mathrm{T})\) 表示 \(\mathrm{S}\) 能放,\(\mathrm{T}\) 不能放的情况下,最大 \(m\)。
考虑最小的 \(i\),讨论:
- \(i\in\mathrm{S}\),\(f(\mathrm{S},\mathrm{T})=\max\limits_{\mathrm{S'}\sube\mathrm{S}\setminus\set{i}}{f((\mathrm{S}\setminus\set{i})\setminus\mathrm{S'},\mathrm{T})+f> (\mathrm{S'},\mathrm{T})+a_i}\);
- \(i\in\mathrm{T}\),\(f(\mathrm{S},\mathrm{T})=\min{(a_i-\epsilon,f(\mathrm{S},\mathrm{T}))}\)。
然后看 \(f(\mathrm{S},[n]\setminus\mathrm{S})\) 即可。
实现时先枚举定出要求的 \(\mathrm{S}\),且所用的 \(\mathrm{T}\) 不用放入状态,而是直接截取 \([n]\setminus\mathrm{S}\) 的前若干位,复杂度为 \(\mathcal{O}(4^n)\)。
P5972. Desant
神秘,从左往右考虑,暴力状压记录选了的点集 \(\mathrm{S}\)。
由于只关心逆序对数量,所以对 \(i\) 后面部分排序后记作 \(x_1,\cdots,x_{n-i}\),只需要知道 \((x_i,x_{i+1})\) 之间有多少个数。
这个东西的状态数 \(\prod{(x_{i+1}-x_{i})}\) 经求导证明是 \(3^{n/3}\) 的。
实现非常依托,对着
std::vector做哈希容易飞,好的写法是使用变进制数。upd:我传参的时候忘加引用了,不然手写哈希还是能稳过的。
QOJ 7597. Alexey the Sage of The Six Paths
先求出最大匹配的上下界,记这个为 \((l',r')\),可以证明这里面的都能调整出来。
对于原限制 \((l,r)\),只需满足 \(l'\le r\wedge l\le r'\)。
对于 \(r'\ge l\),只需满足左右非零度点 \(\ge l\) 即可。
对于 \(l'\le r\),可以由 Hall 定理最大匹配为 \(\min{|\mathrm{L}|-|\mathrm{S}|+|\operatorname{n}(\mathrm{S})|}\),让这个 \(\le r\) 即可。
然后可以左右部分别状压 dp,过程中需要记录度数和,最后枚举一下把两边拼起来。
P10004. Permutation Counting 2
把原问题等价到分别 \(x,y\) 个上升段。
二项式反演,然后 \(f(i,j)\) 的计算比较神秘。
考虑 \(p^{-1}\) 的一个上升段 \(p^{-1}_l,\cdots,p^{-1}_r\),会使得 \(p\) 中值域 \(l\sim r\) 的对应下标递增。
相当于 \(p^{-1}\) 中的每个上升段,都可以分配 \(p\) 中 \(l\sim r\) 的位置给一些连续段,而每个分配方式得出的 \(p\) 是唯一的。
原因:从小到大逐段分配的,\(p\) 中一个连续段在两方案中得到的个数不同,那么不会相同。
然后转化成了个填 \(i\times j\) 的表格 \(a\),\(a_{i,j}\) 表示 \(p^{-1}\) 中 \(j\) 给 \(i\) 的贡献,要求表格和为 \(n\),每列和为正。
这个也可以二项式反演。
ABC 310 Ex. Negative Cost
把耗蓝和回蓝分开看是无用的,但用游戏思维观察一下发现操作序列会有大量重复,称这种重复的子段为一个连招。
假设我们组出了若干连招,肯定是拿着性价比最高的反复打,直到最后补一些别的小伤害。
考虑发掘性质,首先连招可以自给自足,使用时无需条件。
然后连招要能组成最优方案,于是对最优方案进行考虑。
设 \(V=300\ge |c_i|\),可能会认为任意时刻蓝量不超过 \(V\),然而是错的。
考虑调整的过程,对于蓝量超过 \(V\) 的位置,换一个减蓝的过来,可能会变为负数。
如果把限制松到 \(2V\),那么调整的时候就可以保证合法,除非后面都是都是加蓝操作。
这个确实没法防,但是我们可以看作这是若干个连招,而前面也是若干段连招,那就是说连招的蓝量储备不会超过 \(2V\)。
但是我们的代价不是蓝量,而是长度,我们需要求出不同长度的连招。
容易猜到连招长度也是不超过 \(2V\) 的,否则可以找个地方断开变成两个小连招。
那么就可以做背包求出不同长度的连招伤害了。
枚举最优连招的次数是不现实的,但显然我们补刀也不会超过 \(2V\) 次,否则肯定可以拿出一部分打最优连招。
因此对补刀操作做背包,剩下的用最优连招即可。
Fun fact:蓝量限制为 \(V\) 时挂掉是因为减蓝操作可能减多了,而期望下约有 \(\frac{1}{2}\) 的概率不会减多,所以我限制写错了可以过一半多的点。
ARC 138 F. KD Tree
考虑不出来合法的划分情况,考虑对操作序列计数,钦定字典序最小的操作序列。
假设 \(i\) 是最优的情况下,需要容斥掉前面的某个 \(j\) 满足 \(j\) 划出来是 \(i\) 的子问题。
总状态数是 \(\mathcal{O}(n^4)\) 级别的,实际上大概是这么个东西:
设 \(f(l,r,u,d)\) 表示考虑这个矩形内所有点时的方案,记此时对应的点集为 \(\mathbf{T}\)。
我们对操作定序,认为字典序从小到大是 \(x_1,y_1,x_2,y_2,\cdots\)。
考虑我们选择的某个操作,以 \(x_i\) 为例,其划分出两个矩形 \((l,x_i,u,d),(x_i+1,r,u,d)\)。
我们需要划分矩形的方案是字典序最小,那么对左边这个矩形对应出的方案们我们就钦定它字典序最小的第一次操作是 \(x_i\)。
称这个对应的方案数是 \(g_{x_i}\),考虑它的计算,不妨称 \(\mathbf{T_{x_i}}\) 是左边这个矩形。
那么考虑某个 \(j<i\),它会产生影响则说明 \(\mathbf{T_{x_j}}\sub\mathbf{T_{x_i}}\),那么我们会存在方案是把 \(j\) 先切了,再切 \(i\)。
于是需要做一个容斥 \(g_{x_i}\gets -g_{x_j}*f(\mathbf{T_{x_i}}\setminus\mathbf{T_{x_j}})\),这个乘法系数就是把 \(j\) 切后左边剩下部分的组合。
把切 \(y_i\) 的决策也考虑进来,发现他们都可以用 \(\mathbf{T_{i}}\) 这样的形式表示,因此做就完了,对答案的贡献是 \(g_{i}\times f(\mathbf{T}\setminus\mathbf{T_i})\)。
同时考虑 \(x,y\) 时关于正确性的严谨分讨挺依托的,这有个 带图的讲解。
P8350. 进制转换
只考虑 \(z^{b(i)}\),可以拆出 \(z^{\sum[3^k]i}=\prod{z^{[3^k]i}}\),启示我们数位 dp。
然而 \(y^{a(i)}\) 不易处理,一个暴力的想法是数位 dp 的过程中,把前面一部分形成的数 \(t\) 直接计入状态,\(x^i\) 是可以处理的。
众所周知,填低位对高位无影响,而填三进制低位事实上对二进制高位也不存在太大的影响,后面 \(i\) 位最多干扰 \(\lceil i\log_2 3\rceil\) 位。
那么只需存储二进制下这么多位,再记录一下是否对前面产生了进位,就得到了和暴力同级的 \(\mathcal{O}(n)\) 做法。
然后做一个神秘的根号分治,前 \(B\) 位暴力搜,后 \(B\) 位记忆化,可以算出前后部分的 复杂度/状态数 都是根号级别的。
UOJ 84. 水题走四方
因为只能往下走,所以两个人的配合是:A 走一条主链,中途停在某个节点上,让 B 逐条链清理主链外叶子,且 B 最后清理最深的叶子时,A 往下走到下个需要清理的点。
从祖先 \(x\) 往后代 \(y\) 转移,会发现对于 \(y\) 来说,从最深的合法(最深的叶子支持它走到下个点)点 \(x\) 一定是最优的,重剖后二分转移,这个是线性对数的。
这个东西显然容易想到长剖,然后发现长链上不需要二分,可以单调栈处理长链内的,而长链外的只可能是顶端连上去的一个,其他都不优,这个是线性的。
转移的式子就是简单的讨论,需要预处理一下叶子的信息。
upd:
长剖的写法想不明白,单调栈那里不会做,不过官方题解给了个很巧妙的做法:
由下往上确定每个点从哪更新,尝试把没确定的点从父亲更新。
判断依据仍然是除去其子树的最大深度,但可以用预处理的次大深度代替。
对于仍然未能处理掉的,保留到父亲,这部分点集用链表形式组织起来。
UOJ 823. 铁轨回收
“看着没有多项式复杂度,这种一般考虑划分数。”
后面掉了。

浙公网安备 33010602011771号