杂题集4
第 \(61 \sim 80\) 道杂题。
[湖北省选模拟 2023] 棋圣
\(n\) 个点,\(m\) 条边无向连通图,图上有 \(k\lt n\) 个黑/白子。进行任意次操作,每次选定一个空格子,每个棋子选取一条到这个点的简单路径并将这个棋子延简单路径移动一格。每条边都有边权,若有两个不同颜色棋子位于一边两侧则可获得该边权的收益。棋子可重合。
\(1\le n \le 100\)。
第一眼看还以为是割边。。。
事实上若要考虑简单路径是非常复杂的,我们看能否直接讨论能得到怎样的结果。
先讨论一下树的情况,发现由于树是二分图且每次操作所有棋子都会移动一次,所以将所有点进行黑白染色就可以得到一个显然的上界:\((c_{1,0}\times c_{0,1}+c_{1,1}\times c_{0,0})\times w_{max}\)。\(c_{a,b}\) 表示在 \(a\) 色格子上 \(b\) 色棋子的数量。
看看能否取到这个上界。
发现要取到这个上界必要条件是至少有一个度数大于等于 \(3\) 的点(初始就满足的不管),非常显然。再想一想,这是否充要呢?
答案是肯定的。想象以这个度数为 \(3\) 的点作为根,不停轮流操作其三个子树中的叶子节点,所有点总体上就会向根节点靠近。可以一直操作到两棋子间的最大距离为 \(1\)。
如果没有度数大于等于三的那么就是链了。
链就直接 \(O(n^4)\) dp 就行了,好像还可以 \(O(n^3)\) 但是没看懂。
再考虑一下不是树的二分图的情况,此时图中一定有偶环,容易发现还是可以取到上限,包括简单环。
如果不是二分图呢?那么图中就一定有奇环。那么就可以先在生成树上将所有点距离弄成树的最优解,然后再在奇环上改变棋子所在的点的颜色,就可以直接做到 \(c_0\times c_1 \times w_{max}\)。
想清楚后其实主要难点就在于链了,定义 \(dp_{i,l,r}\) 表示将 \(l\sim r\) 的棋子全部放在 \(i\) 点且前 \(r\) 颗棋子已放的最大值,直接转就行,注意两棋子间距不会增大,所以可以砍掉一个 \(n\),变成 \(n^4\)。
CF1530H Turing's Award
给一个长度为 \(n\) 的均匀随机生成的排列 \(a\),初始在 \(0\) 点,\(1\) 时刻,每个时刻结束后可以向左或向右或不走,\(i\) 时刻末尾会将 \(a_i\) 覆盖到当前位置上(可覆盖空位置或之前有数的地方),求最终有数的位置构成的最长上升子序列长度。
\(1\le n \le 15000\)。
很好的一道题。
首先发现如果要考虑覆盖的话似乎没有办法处理,于是将 \(a\) 翻转,变为每个位置上的数是第一次走到该位置上时留下的数,\(a_n\) 一定会留下,所以直接从 \(a_n\) 开始往左右扩展。显然可以使用 dp。
发现每次添加数一定是在左端点或右端点,所以我们需要记录当前新添的数的下标与在左端点或右端点。
这样其实还是不够,如果我们同时记录左右端点的数显然是会炸,所以考虑将当前位置相对的另一个端点用 dp 的值进行表示,LIS 的长度就放到状态里,因为 \(a\) 是随机生成,所以 LIS 的期望长度为 \(\sqrt n\),可行。
贪心的想,显然当在左端点时要记录最小的可行右端点,在右端点时要记录最大的可行左端点。
转移很简单,注意要分类判一下 \(a_n\) 是否放在 LIS 中,因为其他不放在 LIS 中的数都一定存在一种方式不将其放到序列里,而 \(a_n\) 若不放在 LIS 中则要多占一个中间的位置导致跨越区间的时间增加。
[CF1648D] Serious Business
在一个 \(3 \times n\) 的网格中,从 \((1, 1)\) 出发到 \((3, n)\),只能向右或向下移动。初始时第二行不可通行,但可以通过若干操作(代价为 \(k_i\))解锁第二行的某些区间 \([l_i, r_i]\)。求路径经过单元格数值之和减去解锁总代价的最大值。
\(1 \le n,q \le 5\times 10^5\)
感觉整个人都变成呆瓜了。
首先求一下三行的前缀和,令 \(dp_i\) 表示走到第 \(2\) 行第 \(i\) 列就停下后得到的最大价值,答案显然就是 \(\max\{dp_i+suf_{3,i}\}\)。
那么该如何转移 dp 呢?发现主要的难点在于解锁节点是按照区间来的,相对我们 \(dp_i\) 的定义会显得有点混乱,所以我们需要理清选取区间的顺序。发现 \(r_i\) 并没有被经过的选取的区间至多有一个,所以我们就可以从这最后一个区间下手。
考虑两种情况,一是当前是从第二行前面的某个区间进入了当前区间,二是直接从第一行扎进当前区间。
先考虑第一种情况,此时显然可以直接从 \(dp_{l-1}\) 转移,可以用 multiset 加双指针来维护所有覆盖到当前点的区间和最大值,其实这就是扫描线。
难点在于第二种情况:
列出来式子:\(\max_{l\le j \le i}\{pre_{1,j}-pre_{2,j-1}+k\}+pre_{2,i}\),似乎有点摸不着头脑,但是仔细观察可以发现 \(1\le l\le j \le i\),哈哈。但是确实是从这里入手,因为这个转移式子跟别的 dp 量没有任何关系,所以转移顺序是无所谓的,然后你就可以倒序枚举 \(i\) 然后加入能覆盖到 \(i\) 的区间。此时 \(i\) 是固定的,我们把 \(k\) 扔到 \(l\) 上面,发现此时的结果就变成了一个 \(\max_{L\le i\le j \le R}\{A_i+B_j\}\) 的形状,这个可以用线段树求。
然后就没力。
整数的lqp拆分
对于一个正整数 \(n\),我们定义他的一个拆分的价值为:\(f_{a_1}\times f_{a_2}\times \dots \times f_{a_m}\),其中 \(a_1+a_2+\dots + a_m=n\),\(f_i\) 表示斐波那契数列的第 \(i\) 项,特别的 \(f_0=0\)。
求 \(n\) 的所有有序拆分的价值之和,对 \(1e9+7\) 取模。
\(1\le n \le 10^{10000}\)。
生成函数。
首先容易知道正常斐波那契数列的生产函数 \(F(x)=\frac{1}{1-x-x^2}\),因为直接将 \(F(x)\) 向右移 \(1\) 和 \(2\) 位后对齐就可以抵消。对于本题,\(F(x)=\frac{x}{1-x-x^2}\) 因为从 \(0\) 开始。
令答案的生成函数为 \(G(x)\),发现如果将 \(n\) 划分成 \(k\) 个数,则生成函数为 \(F(x)^k\),由于可以随意划分,\(G(x)=\sum_{i=0}^{\infty} F(x)^i\),即 \(\frac{1}{1-F(x)}\)。
将 \(F(x)\) 代入得:\(\frac{1-x-x^2}{1-2x-x^2}=1-\frac{x}{x^2+2x-1}\)。接下来要考虑的就是如何将这个封闭形式展开。
考虑因式分解:\(x_1=\sqrt2+1\),\(x_2=-\sqrt2 +1\),\(-\frac{x}{x^2+2x-1}=-\frac{x}{(x-x_1)(x-x_2)}=\frac{x}{x_2-x_1}\times (\frac{1}{x-x_1}-\frac{1}{x-x_2})=\frac{x}{x_2-x_1}\times (\frac{1}{x_2}\frac{1}{1-x/x_2}-\frac{1}{x_1}\times \frac{1}{1-x/x_1})\)。
此时就可以展开:\(\frac{x}{x_2-x_1}(\frac{1}{x_2}\sum_{x=0}^{\infty}\frac{x^i}{x_2^i} - \frac{1}{x_1}\sum_{x=0}^{\infty}\frac{x^i}{x_1^i})\)。
得 \(G(x)\) 第 \(n\) 项的系数为 \(\frac{1}{x_2-x_1}(\frac{1}{x_2^n}-\frac{1}{x_1^n})\)。
代入得 \(\frac{\sqrt2}{4}[(1+\sqrt2)^n-(1-\sqrt2)^n]\)。
\(\sqrt2 \ \text{mod} 10^9+7\) 意义下为 \(59713600\),然后用费马小定理求解答案即可。
付公主的背包
有 \(n\) 中商品,第 \(i\) 种体积为 \(v_i\),每种物品数量无限。求总体积为 \([1,m]\) 的情况分别有多少选择商品方案。
\(1\le n,m\le 10^5\)。
小清新生成函数神题。
首先非常显然发现答案的形式幂级数可写为:
此时问题就变为了如何求 \(\prod _{i=1}^{n}(1-x^{v_i})\),首先发现不可能一个个直接卷积,然后又发现直接乘形式幂级数也不太合理。
此时就出现了一个精妙绝伦的方法,先将所有式子都变成对数,然后就可以直接做加法!最后再用多项式指数转换回去即可。
但是多项式求对数依然是 \(\text O(n\log n)\),似乎还是不可行。
不过本题具有一定特殊性:
然后发现只有 \(\text O(m/V)\) 个位置有值,所以只需要统计对于每个 \(V\) 有几种物品,最后就能 \(\text O(m\log m)\) 完成求对数并做加法的操作。
那么这怎么证呢?
得:
完事。
翻转
https://www.becoder.com.cn/contest/6401/problem/3
\(n\) 个数,每次可以将其中一段区间上的数 \(\times(-1)\),求最少需要多少次操作使得任意相邻两数的差的绝对值都不相同或判断无解。
\(1\le n \le 10^5\)。
首先有一个一眼的结论,就是每次相当于只改变了区间两端的差值,所以答案为改变次数除二向上取整(可以让一端靠边)。
一个非常简单的做法是费用流,当然要用 dinic 才能卡过去。
还有一个非常神奇的做法:
把每个可能出现的差都看成一个点,一开始所有 \(|a_{i}-a_{i+1}|\) 向\(|a_{i}+a_{i+1}|\) 连边,每次操作相当于改变边的方向。显然合法的情况满足所有点至多有一个出边。根据鸽巢原理,每个连通块只有可能是基环树或树。
基环数的情况就直接枚举环的方向。
树的情况可以换根解决。
[SDOI2013] 保护出题人
共有 \(n\) 关与 \(n\) 种僵尸,第 \(i\) 种僵尸血量为 \(a_i\),在第 \(i\) 关中,共有 \(i\) 个僵尸从前往后分别为第 \(i\) 种,第 \(i - 1\) 种……第 \(1\) 种。僵尸之间的距离为 \(d\),最前方的僵尸距离植物 \(x_i\),僵尸每秒移动 \(1\) 单位,第 \(i\) 关的植物每单位时间看可以造成 \(y_i\) 的伤害,求 \(\sum ^n_{i=1} y_i\) 的最小值。
\(1 \le n \le 10^5\)。
非常神奇的一道题,事实上这并不是 dp。
容易发现 \(y_i=\max_{j=1}^{i}\{\frac{sum_i-sum_{j-1}}{x_i+id-jd}\}\),然后你就惊喜地发现这个值其实就是 \((sum_i,x_i+id)\) 和 \((sum_{j-1},jd)\) 之间的斜率。
直接凸包上二分就行了。
[agc004F] Namori
题意:给定一个 \(N\) 个点,\(M\) 条边的连通图,没有自环,没有重边。其中 \(N-1\le M\le N\),每个点初始是白色。每次操作可以处理一条边,其两个点如果颜色相同则都变成相反的颜色(黑变白,白变黑)。询问能否将每个点都变为黑色。如果能,输出最少的操作数;如果不能,输出 \(-1\).
有点像集大成的一道题。
首先是一个非常典的套路了。
这个变色操作显然可以看成先将两个点交换再都变成相反色。
先讨论二分图的情况,发现如果是在二分图上,那每个点确定位置后变色次数的奇偶是确定的,所以可以直接提前将二分图的某一半的点颜色直接取反,现在相当于把所有白点移到黑点位置上,黑点移到白点位置上。
一个显然的条件就是黑点白点数量一样。
得出这个结论后我们先看看树的情况怎么做。
想一想就可以发现答案有一个下界就是 \(\sum _{u=1}^n |cnt_{u,0}-cnt_{u,1}|\),就是所有子树内部的黑白节点数量之差的和。这是 \((u,fa_u)\) 这条边的至少需要的操作次数。
然后你又可以发现这个下界是可以取到的,直接按拓扑序来操作每个子树就行了。感性理解一下发现不可能存在某次操作被浪费的情况。
然后再来看基环树且偶环的情况怎么处理。
这种先考虑删掉一条环上的边,此时记录一下除这条边以外所有边都操作后所有点子树中黑白点数量差值,若删除的边是 \((u,v)\) 且取一环上点作为树根,则 \(u \to rt\) 的值全是 \(k\),\(v \to rt\) 的值全是 \(-k\),当然 \(rt\) 的值是 \(0\),此时则需要附加 \(k\) 次操作。
怎么求最优的 \(k\) 呢?发现 \(|x-k|\) 的部分相当于 \(x\) 和 \(k\) 之间的距离,\(|x+k|\) 的部分相当于 \(-x\) 和 \(k\) 之间的距离,额外的 \(k\) 的代价相当于 \(0\) 到 \(k\) 的距离,直接初中数学求中位数就行了。
最后再来看一下奇环的情况怎么办。
此时割掉一条边后染色,发现边的两端是同色点此时操作一次可以将白点数量加 \(2\) 或减 \(2\),此时显然可以发现只要图中黑点白点奇偶性相同就合法,只需要将答案加上 \(\frac{|cnt_0-cnt_1|}{2}\) 就行。当然,要提前将边的两端的值修改 \(\frac{|cnt_0-cnt_1|}{2}\) 使得最终黑白点数量相同。至于正确性...感性理解吧。
[AGC060C]Large Heap
有一个 \(2^N-1\) 个节点的小根堆,节点权值为 \(1\sim 2^N-1\) 的排列。
给定正整数 \(A\) 和 \(B\)。令 \(U=2^A\),\(V=2^{B+1}-1\)。在所有像堆的排列中任取一个,求 \(P_U \lt P_V\) 的概率。模 \(998244353\)。
数据范围:
- \(2 \le N \le 5000,1 \le A,B \le N-1\)。
首先你可以发现。你什么都发现不了。。。
但是对于权值是排列的这种问题有一个 trick 就是按照权值从小到大来填。
此时如果要填一个数那么当前位置的父亲必须已经填过,欸!好像没有后效性了欸。
此时令 \(dp_{i,j}\) 表示左边的那个点深度为 \(i\) 且子节点都没有填,右边的那个点刚好填到 \(j-1\),\(j\) 还没有填(这么整是因为求的是小于的概率)
然后转移你就看接下来填哪个就行,如果填的是 \(i\) 的下一层,那么概率为 \(\frac{\binom{siz_{i+1}+siz_j-1}{siz_{i+1}-1}}{\binom{siz_{i+1}+siz_j}{siz_{i+1}}}=\frac{siz_{i+1}}{siz_j+siz_{i+1}}\),直接转到 \(dp_{i+1,j}\)。
如果填的是 \(j\),那么就转移到 \(dp_{j,i+1}\),发现这一步转移还是挺妙的哈。
然后就没啦!
[CF838D]Airplane Arrangements
有 \(n\) 个座位,\(m\le n\) 个人,这些人从 \(1\sim m\) 号依次选择座位,选择座位的方式是先选定一个位置然后选择在编号小于等于或大于等于这个位置的地方落座,每个人都可以在落座前选择自己的入座方法。
求有多少种方案使得每个人都可以按照自己的落座方案拥有座位。
\(1\le m \le n \le 10^6\)
神题!!!
考虑在 \(1\) 号座位和 \(n\) 号座位间添加一个座位 \(n + 1\),此时就构成了一个环。发现如果按照原题目的方法来落座,只要 \(n+1\) 号位置有人那就不合法,发现实际上环上的每个点都是等价的,所以在任意选方案的情况下有 \(\frac{n+1-m}{n+1}\) 的概率不合法!总情况数为 \((2\times n+2)^m\),乘一下概率就是答案。
[清华集训 2014] 主旋律
给定一张 \(n\) 个点 \(m\) 条边的有向图,求有多少种删边方案(可不删)使得最终的图强连通。
对 \(10^9+7\) 取模。
\(1 \le n \le 15\)。
小清新 dp 好题!但是不会
一眼状压,很容易定义状态:\(dp_S\) 表示选点方案为 \(S\) 时最终强连通的方案数。
好!那么好!不会了!!!
容易想到用总方案减去不合法方案,最初我想的是从 \(S\) 中分出固定包含 \(lowbit(S)\) 的强连通分量,but!其余点的归属情况不确定,所以得出构不成强连通的方案数。归根结底就是怕有的正向边和反向边连载同一个分量上。
那么好,为了避免这个问题,我们直接摘去所有缩点后 DAG 上度数为 \(0\) 的点,这样就只需要考虑正向边啦!
但是此时出现了一个问题,我们如果进行子集枚举那么好像并不好保证没有其余的不在状态中的入度为 \(0\) 点,也就是我们只能钦定。因此想到容斥!
令 \(g_S\) 表示将 \(S\) 中的点划分成若干没有边相连的分量的奇数方案数减偶数方案数(这是为了自带容斥系数)
\(E_{A,B}\) 表示起始点在 \(A\) 集合中,终点在 \(B\) 中的边数。
\(g_s=dp_S-\sum_{T\subset S \and lowbit(T)=lowbit(S)}g_{S-T}\times dp_{T}\)。
\(dp_S=2^{E_{S,S}}-\sum_{T\subset S}g_T\times 2^{E(S-T,S-T)+E(T,S-T)}\)
\(E(S,S)\) 直接预处理,\(E(T,S-T)\) 直接对于每个 \(S\) 子集枚举单独处理,时间复杂度 \(3^n\)。
[ARC150F]Constant Sum Subsequenceg
给定一个长度为 \(N\times N\) 的序列 \(A\),其由 \(A_1\sim A_N\) 重复 \(N\) 次组成。求最小的 \(L\) 使得所有总和为 \(S\) 的正整数序列都是 \(A_1\sim A_L\) 的子序列,保证 \(A\) 中包含 \(1\sim S\)。
\(1\le S \le 2\times 10^5,S\le N\le 1.5\times 10^6\)。
首先你需要想一想朴素 dp 怎么做,发现 \(S\) 这个总和相对来讲是很小的,考虑令 \(dp_i\) 表示序列总和为 \(i\) 时能延伸的最远距离,答案显然为 \(dp_S\)。
令 \(ne_{i,j}\) 表示 \(i\) 之后第一个 \(j\) 的下标,\(pr_{i,j}\) 同理。显然:
\(ne\) 和 \(pr\) 很容易可以 \(\log n\) 求,所以此时复杂度为 \(S^2 \log n\)。
容易想到有没有办法把一个 \(S\) 优化为 \(\log S\)。
这个 dp 只能从前往后转,但是似乎并不能直接用线段树之类的来优化,所以考虑一些“优雅暴力”——分治。
这里用到了 CDQ,先处理 \([l,mid]\),再考虑从 \([l,mid]\) 转移到 \([mid+1,r]\),最后处理 \([mid+1,r]\)。
显然是不能枚举 \([l,mid]\) 的,必定会炸。考虑一下能否枚举下一个元素的值 \(k\)。
发现如果 \(ne_{dp_i,k}<ne_{dp_{mid},k}\) 就说明 \(ne_{dp_i,k}\le dp_{mid}\le dp_{mid+1\sim r}\),必定不可行。而可行的就一定满足 \(ne_{dp_i,k}=ne_{dp_{mid},k}\),欸!值是固定的!然后我们有惊喜地发现满足 \(ne_{dp_i,k}=ne_{dp_{mid},k}\) 且 \(i+k\le r\) 的 \(i\) 是一个区间!并且造成贡献的区间就是这个区间右移 \(k\),也是一个区间!
所以就可以直接线段树区间取 max,单点查询,具体实现可以用标记永久化。
复杂度 \(\text O(n\log n \log S)\)。
[CF1392H] ZS Shuffles Cards
有编号为 \(1\sim n\) 的 \(n\) 张卡牌和 \(m\) 张 joker。每轮随即从排队中抽一张直到抽到 joker,抽一张牌消耗 \(1\) 单位时间,抽到 joker 后将所有牌放回牌堆重开一轮。求 \(1\sim n\) 每张牌都被抽到过的期望时间。
\(1\le n,m \le 10^6\)。
啊!这就是我的梦中情题!!!
- 首先是超迪奥的第一步:
\(ans=E(\text{轮数})\times E(\text{每轮抽牌次数})\)!
虽然这一看就很对!但是并不妨碍我想不到。
- 然后是超迪奥的第二步:
\(E(\text{一轮抽牌次数})=n\times E(\text{某张牌被抽到})+1=n\times E(\text{某张牌前面没有 joker})+1=\frac{n}{m+1}+1\)。
相当于在 \(m+1\) 个空里插一张牌,但只能插在最前面。
- 最后是超迪奥的第三步:
\(E(\text{轮数})=\sum^n_{i=1} E(\text{还剩 i 张牌时抽到可用卡牌所用额外轮数})+1=\sum_{i=1}^n\frac{m}{i}+1\)。
为什么是 \(\frac{m}{i}\) 呢?因为卡牌出现在 joker 前的概率为 \(\frac{i}{m+i}\),所以期望轮数为 \(\frac{m+i}{i}\),但是我们求的是额外轮数,所以减一得 \(\frac{m}{i}\)。
所以!\(ans=(\frac{n}{m+1}+1)(\sum^n_{i=1}\frac{m}{i}+1)\)。
[AGC023F] 01 on Tree
给定一个 \(n\) 个节点的有根树,每个点都有 \(0/1\) 的权值,现在要将树上的节点展成一个拓扑序,求所有节点的权值排在一起的逆序对数量的最小值。
\(1 \le n \le 2\times 10^5\)。
好久没写杂题集了。
首先比较好想的是如果从根节点开始往下选遇到了 \(0\) 就一定要走,但是此时就发现没有思路了。
这里就不得不提到一个非常有意思的想法:从下往上合并至一个节点。
此时只需要用并查集记录每个节点合并到的点,用数组记录每并查集上的根节点节点所包含的小节点中 \(0/1\) 节点和逆序对的数量。
按什么顺序合并呢?
容易想到此时每个节点的权值就是非常经典的 \(\frac{cnt_1}{cnt_0}\),从小到大选,这个可以通过交换相邻操作来证。

浙公网安备 33010602011771号