杂题选做(3)
ARC068F
额首先第一阶段,进入这个 deque 的时候,一定是一个单谷的状态。且 \(1\) 为最小值。
然后考虑后面我出队的时候,出到 \(1\) 的时候,剩下来 deque 里面一定是一段单调的序列。
也就是说,假如我钦定出队按元素大小,从大到小出,那么算出来的方案,在最后要乘上 \(2^{\max(0, n-k-1)}\)。不难发现目前这部分不会算重,也不会算漏。
这么钦定有什么好处呢?
这样一个结果序列合法,当且仅当她可以被分成两个单调递减的子序列。
然后由 Dilworth,等价于不存在一个长度为 \(3\) 的递增子序列。
这是第一个难点。
第二个难点是,我怎么设计状态,对 \(p_k=1\) 计数。
考虑逆排列 \(q\)。发现原排列的合法性和逆排列的合法性是等价的!
这样就要求 \(q_1=k\)。
设 \(f_{i,j}\) 表示,\(\{1,2,\dots, i\}\) 构成的排列中,\(q_1=j\) 的。
转移的话,考虑 \(q_2\) 的大小,分成 \(<j,=i-1,\text{otherwise}\) 三类。
不难稍微前缀和一下做到 \(O(n^2)\)。
更进一步地,可以把状态转移直接写成格路计数的形式。(归纳证明)
然后反射容斥做到线性。
AGC013D
哎首先我们可以刻画这个合法的条件对吧。那我们可以把问题转化为,在一个

这样的网格中,每个格子里有一个区间 \([l, r]\),从 \((1, 1)\) 开始走,只能向下一步或向右下一步,走到 \((2m, *)\),求路径上区间交非空的方案数。
那好像这个东西只能枚举最终的区间右端点,简单差分一下去重,做到三次方。寄。
学习题解做法。注意到我们可以直接 DP,记录 \(f_{i,j}\) 表示我操作了前 \(2i\) 个,现在有 \(j\) 个红砖,\(n-j\) 个蓝砖。转移讨论一下 RB 就行。
但是这样 DP 出来显然和结果序列不是一一对应。因为我多个初始状态(初始 \(j_0\) 个红砖,\(n-j_0\) 个蓝砖)可能对应同一个合法的结果序列。
哦。那你考虑我 \(n\) 的时候 DP 一下,求出来个答案;我 \(n'=n-1\) 的时候求出来个答案。两个一减就是最终答案。
为啥是对的?
\(n'=n-1\) 的时候,相当于钦定了我始终有一个红砖放在箱子里。那我可以理解为,我钦定了某一次红砖恰用完。容易发现(你也是注意力惊人???),我这样钦定之后,就和结果序列构成双射了。
复杂度 \(O(nm)\)。
AGC040F
大大大神秘题。
那么首先这个操作 2 很搞事情啊。我们如果只考虑操作 1 呢?
有一些基本的钦定是,设棋子 1 永远在棋子 2 的前面。然后这里如果我只考虑操作 1 的话,我先让棋子 2 往前走一步,然后钦定 1 和 2 的距离 \(d\) 永远大于等于 \(1\)。
用一个二元组 \((b,d)\) 来表示棋子的状态:棋子 1 的坐标为 \(b-d\),棋子 2 的坐标为 \(b\)。
那操作无非三种:
- 操作 1:
- \(b\) 加一,\(d\) 加一;
- \(d\) 减一;
- 操作 2:\(d\) 清零。
那么考虑我进行了操作 \(1\) 若干次,我枚举末态的 \(d\),要求 \(d\ge B-A\)。
然后把清零操作插入进去,使得我降低末态的 \(d\),直到等于 \(B-A\)。
关键的观察是,我能把清零操作插入到某个位置后面,当且仅当她是严格后缀最小值。
证明的话,因为清零相当于后缀整体下降一些高度,然后我要求后面的下降了之后还要 \(\ge 1\),所以是严格最小值。然后后面即使有过一些清零操作,也救不了,因为 \(d\) 只会 \(\pm 1\) 地变化。
进一步地,我只有最后一次清零才会对末态产生影响!所以我最后一次清零的位置是固定的!
然后我插入位置的个数也是固定的(\(d-B+A+1\))!不随我只考虑操作 1 的序列的形态而变化!!!!这就是妙的地方啊。所以插入的系数就是一个隔板法。(\(d=B-A\) 的时候要特判一下)
所以最终的答案就是一个格路计数(反射容斥)乘上隔板法,求和。复杂度线性。可能需要特判 \(A=0,B=0\)。
CF1770F
世纪名题。
额首先 \(n\) 为偶数答案肯定是 \(0\)。\(n\) 为奇数时,由一些配对手法,只需要管 \(a_1\)。
那么直接写式子了啊。枚举 \(a_1\),算方案数的奇偶。
这一步逆用 Lucas 无敌了。
接下来就是
复杂度 \(O(y\log y)\)。
P12251
很牛,但也很 tricky 的题目。一年之前场上只会暴力,并且 DFS 内部写的还是 \(O(n^2)\) DP。现在来补一下吧。
哦然后现在知道了原来波特就是 bot 的意思。
首先你对于一个确定的卡片序列,我怎么计算答案?
\(O(n^2)\) DP 还是太唐了,并且也没法在外层 DP 中刻画。
那么这是一个很典的模型啊,考虑倒着取,每到一个就往堆里塞,隔一个取一个堆顶。
现在考虑怎么算期望。然后又是做烂的拆期望。因为这个堆的结构太难刻画了,考虑枚举一个 \(t\ge 1\),转成计算我期望能取到多少个 \(\ge t\) 的牌,最后加起来。
DP 是平凡的:设 \(f_{i,j}\) 表示考虑后 \(2(n-i+1)\) 个牌,目前还有 \(j\) 个大于等于 \(t\) 的牌备用,期望能取出多少个。转移的话,稍微讨论一下这两张是大于等于还是小于 \(t\) 的,小于 \(t\) 的话讨论一下 \(j\) 是不是为 \(0\)。
我的写法比较糖啊,还需要维护一个 \(g\) 表示概率。但把转移边画出来,看成路径权值和,好像直观一点。
进一步地,考虑优化这个 \(O(n^2m)\) 的东西。
发现每一步的概率形如 \(k_i\times \max(s_i-t, 0)\),其中 \(k_i,s_i\) 都是和 \(i\) 有关的常数。
那么是一个关于 \(t\) 的一次或常函数。
算出来的概率,也是一个关于 \(t\) 的函数。经典地,使用插值技巧优化。
但是这里有个小问题:\(t\) 在不同的范围内是分段的,那也就是说我们需要在 \(O(n)\) 段中,每段都取 \(O(n)\) 个点值,每个点值再 \(O(n^2)\) DP 一下。爆掉了。
马队:DP 值可以重复利用。
因为 \(t\) 分段,即在一个前缀中那个概率,总是只能取到 \(0\)。那恰好可以利用之前的 DP 值。
那么现在可以 \(O(n^3)\) 把每一段的多项式算出来了。
最后我们要计算一个形如 \(\sum_{x=l}^r f(x)\) 的东西,这个是 CF622F。不过这里没必要线性插值就是了。
额那我们现在可以写出一个常数巨大的代码。
很唐啊,插值来插值去的。
你动点脑子,算 \(A\) 的前缀和的时候,多插两遍干什么。
首先,算 \(A\) 的系数的时候,用到的点值恰好为 \(1\sim n+1\)。额不仅 \(\sum x^k\) 关于 \(n\) 是 det 为 \(k+1\) 的多项式,\(\sum_{x}A(x)\) 关于 \(n\) 也是次数 $ \le \det(A)$ 的多项式 \(B\)。
那我直接把这些点值求一个前缀和,再插值一下,不就把 \(B\) 弄出来了。那只需要一次插值就行了。
稍有卡常。
注意这里 \(t\) 要取到 \(n+2\),并且概率那里要把 max 去掉,这样在 \(t>m\) 的时候也符合多项式的性质。
复杂度 \(O(n^3)\)。
CF103E
题目条件限制很诡异啊。什么叫,任意 \(k\) 个集合的并集大小不小于 \(k\)???
md 想了一年终于反应过来 Hall 定理。
构造一个二分图,左 \(i\) 到右 \(j\) 有边,当且仅当集合 \(i\) 中包含 \(j\)。
那这个二分图是有完美匹配的。
这个完美匹配有什么用呢?
额,你任意抠下来一个完美匹配。
然后我可以通过一些置换,使得左 \(i\) 匹配右 \(i\)。
那进一步地,残量网络上,\(i\) 到 \(j\) 有边,就代表我假如选了 \(i\),就必须选 \(j\)。
然后就是一个最小权闭合子图。下班。
时间复杂度 \(O(n^{坤})\)。
AGC002E
额从大到小排序,画成点阵图,每次要么去掉左边一列,要么去掉下面一行。
然后就直接 DP 必胜或必败态。那么找一下规律发现,对角线上 DP 值是一样的。(这个随便归纳)
然后就取 \((1,1)\) 的一个对角线,往上走,判一下到顶和到右的长度的奇偶性就行了。
P11565
唉。唉。唉。
首先很傻逼的 DP 是,考虑 \(f_{i,j,k,l,0/1}\) 表示第 \(a_i=j,a_{i+1}=k, a_{i+2}=l\),Alice 还是 Bob,的答案。一次只转移两个,即 \(j\) 减二,\(k,l\) 挑一个加一。复杂度不知道多少。
然后我一个一个减二太唐了,考虑我减完是什么形态。
那记 A 和 B 各操作一次为一轮,对于 \(a_i\),除了最后一轮(可能不完整),其他轮一定是 \(k\) 和 \(l\) 各加一。
证明是非构造性(这个词恰当吗)的,感性理解就是,如果一个人最优方案给 \(j\) 加一了,那么另一个人就不能再给 \(j\) 加一了,要不然不就助长对面了。
然后最后一轮的话,对于 \(\lfloor \frac j2 \rfloor\) 为偶数的情况,要分三叉向下递归。为奇数的情况分两叉。
复杂度的话,首先递归层数是 \(O(\log)\) 的,因为每层 \(\sum a_i\) 减半。
然后分叉的话,注意到 \(j,k\) 都是连续的,所以大概分别也是 \(O(\log)\) 的。加上记忆化的 map,总复杂度四个老哥。
CF1320E
首先这个多组询问的形式,闭着眼睛建虚树。
然后考虑怎么算单组询问。
注意到病毒会有【阻断】。然后从下往上 DP 一遍,再从上往下 DP 一遍。复杂度 \(O(|V|)\)。瓶颈在于建虚树。
具体地,DP 维护一个二元组 \((t, j)\),表示 \(u\) 在 \(t\) 时刻被 \(j\) 病毒感染。那我问你这题难在哪。
QOJ17186
这题很牛逼啊。
直接贪肯定搞不了的。
首先考虑一个深度序列 \(dep\) 合法的充要条件是什么。
- \(\sum_{i=1}^n 2^{-dep_i}=1\)。也即,\(\sum_{i=1}^n \sum_{j=1}^{dep_i} 2^{-j}=n-1\)。这个形式下面要用。
这个刻画见过又忘了/fn
首先本质不同的询问只有 \(O(\log nV)\) 个,因为你要把正常哈夫曼树卡成树高很高的,每次大概要怎么增加一倍。
那我们对于这 \(O(\log nV)\) 个询问,每个都暴力求答案。
对于一个确定的 \(d=O(\log)\),怎么求答案?
画出一个 \(d\times n\) 的表格,我们要选出若干个格子,使得重量等于 \(n-1\),代价最小。
格子 \((i,j)\) 的代价为 \(a_j\),重量为 \(2^{-i}\)。妙妙妙啊!!!
然后要求是,每列都要选一个前缀。(实际上这个限制是假的,因为这里错解一定不优)
然后就是,我们给 \(a\) 升序排序之后,每行也只能选一个前缀了。
关键观察:最后一行一定选偶数个!!!!!证明显然。
又因为只能选前缀,所以最后一行,\(2j\) 和 \(2j-1\) 可以 merge 起来,重量乘二,代价相加。
和倒数第二行归并起来,变成子问题。
答案就是第 \(0\) 行的,前(好像总共也就只有)\(n-1\) 个代价的和。
时间复杂度 \(O(n\log^2nV)\)。
当然,如果在对每个 \(d\) 暴力求答案的基础上,上一点手法,统一合并,好像是可以做到一个老哥的。不过没必要。跑了 980ms。
Circular Sushi
好题,做不出来的题。
首先,一个核心结论是,存在一个最优解,选择的时间 \(t\)(显然不会是无理数)的分母是 \(2\) 的幂次(显然这个幂次 \(\le 2^L\))。
官方给了一个看起来很牛逼的证明。
- 令 \(t=\frac pq\)(最简分数)有 \(q\) 不是 \(2\) 的幂次。令 \(q=2^ex\),其中 \(e\) 为极大的指数。
- 这样 \(x\) 是奇数,和 \(2^L\) 互质,就有逆元。那么存在 \(y\) 使得 \(y\times 2^L+1=x\)。
- 令 \(t':=t\times x\)。考察在 \(t'\) 时刻取寿司会不会更劣。
- 不会。因为原来 \(A+t\times V\equiv 0\pmod {2^L}\),现在 \(A+t'\times V=A+(-A)\times x\equiv -y\times 2^L\equiv 0\pmod {2^L}\)。
- 那么就可以拿掉 \(q\) 里面非 \(2\) 的幂次。
然后就可以先令 \(A\gets A\times 2^L,L\gets L\times 2\),转化为只有 \(t\) 为整数的情形。
那么此时用扩欧是可以解出来 \(t\) 的通解的,形如,对于一个 \(i\),\(t\equiv r_i\pmod {2^{k_i}}\) 时,才能加上 \(W_i\) 的贡献。
那么相当于 \(t\) 看成字符串,后缀是 \(r_i\) 时加上贡献。字典树上随便统计一下即可。复杂度 \(O(nL)\)。

浙公网安备 33010602011771号