CF泛做
CF1392I Kevin and Grid
给定 \(n\times m\) 的矩形,位置 \((i,j)\) 的权值为 \(a_i+b_j\) 。
\(q\) 次查询,每次给定 $ t$ ,将权值 \(\ge t\) 的格子染红,\(<t\) 的格子染蓝。对于一个同色连通块,若触碰边界则贡献为 \(1\) ,否则为 \(2\) ,求红色连通块与蓝色连通块贡献之差。
\(1\le n,m,q\le 10^5,t\le 2\times 10^5\) 。
Solution
先考虑单个 \(t\) ,一张平面图,记红点图为 \(G_1\) ,蓝点图为 \(G_2\) ,则有欧拉公式:
但触碰边界和未触碰边界的连通块贡献不同,记 \(g\) 表示未触碰边界的连通块数。
对于 \(g_1\) ,考虑蓝点图劈成的平面,剔除四连通块(即田字格)以及一个无限大的平面,剩下的平面均是红连通块 \(g_1\) , 因此再设 \(h\) 表示四连通块数,则 \(g_1=F_2-h_2-1\) 。
我们要求的答案是:
对于 \(V\) 即求 \([x^{\ge t}]\sum x^{a_i}\sum x^{b_i}\) ;
对于 \(E\) 即求 \([x^{\ge t}]\left(\sum x^{\min (a_i,a_{i+1})}\sum x^{b_i}+\sum x^{a_i}\sum x^{\min (b_i,b_{i+1})}\right)\) ;
对于 \(h\) 即求 \([x^{\ge t}] \sum x^{\min (a_i,a_{i+1})}\sum x^{\min (b_i,b_{i+1})}\) 。
这些可通过做 \(6\) 次 dft 和 \(5\) 次 idft 得到,时间复杂度 \(\mathcal O(n\log n)\) 。
CF1528F AmShZ Farm
定义 more-equal 序列为:给每个位置分别加上一个非负整数后,序列能构成一个 \(1\sim n\) 的排列。求有多少个二元组 \((a,b)\) ,其中 \(a\) 是长为 \(n\) 的 more-equal 序列,\(b\) 是长为 \(k\) 的下标序列(可重),满足 \(a_{b_1}=a_{b_2}=...=a_{b_k}\) 。答案对 \(998244353\) 取模。
\(1\le n\le 10^9,1\le k\le 10^5\) 。
Solution
考虑这样一个流程:有一个大小为 \(n\) 的车库,对于第 \(i\) 辆车找到最小的 \(j\ge a_i\) 空闲位置停车。显然 more-equal 序列满足所有车均有位置停车。
考虑修改一些限制,这次有一个大小为 \(n+1\) 的环形车库,对于第 \(i\) 辆车找到最小的 \(j\ge a_i\) (注意这次有 \(1\le a_i\le n+1\) )空闲位置停车。记 \(x\) 为最终空闲的停车位,显然 more-equal 序列满足 \(x=n+1\) 。
对于该 more-equal 序列,我们考虑将它所有元素 + t (即 \(a_i=(a_i+t) \bmod (n+1)+1\) ),可以发现 \(x\) 变成了 \(x+t\) 。因此对于 \(t=0\sim n\) 可以发现恰好只有一个序列是 more-equal 序列。
不难得到 more-equal 序列的总个数为 \(\frac{1}{n+1}(n+1)^n\) 。
接下来枚举 \(a_{b_1}=x\) ,并枚举 \(x\) 在 \(a\) 序列中出现的个数: \(\sum_{i=0}^{n}\binom{n}{i}n^{n-i}i^k\) 。有 \(n+1\) 种 \(x\) ,再除掉一个 \(n+1\) ,相互抵消掉了,因此最终答案就是该式子。
将 \(i^k\) 转下降幂,化简得到式子 \(\sum_{j=0}^{k}n^{\underline{j}}n^{n-j}S(k,j)(1+n^{-1})^{n-j}=\sum_{j=0}^{k}n^{\underline{j}}S(k,j)(n+1)^{n-j}\) 。
利用 载谭 Binomial Sum:多项式复合、插值与泰勒展开 可做到线性,时间复杂度 \(O(k)\) 。
\(CF1374F\)
给定一个长度为 \(n\) 的数列 \(a_1,a_2,...,a_n\) 。每次可以选定 \([a_i,a_{i+1},a_{i+2}]\) ,将它循环右移,即变成 \([a_{i+2},a_{i},a_{i+1}]\) 。
你需要在不超过 \(n^2\) 次该操作下,使得数列有序。如果无解输出 \(-1\) 。
\(3\le n\le 500, 1\le a_i\le 500\)
Solution
先考虑排列该如何处理。显然,从 \([a_i,a_{i+1},a_{i+2}]\) 到 \([a_{i+2},a_{i},a_{i+1}]\) ,逆序对的变化量为偶数。所以如果一开始的排列逆序对数为奇数,则无解。
否则,按贪心顺序,将第 \(i\) 小的数放到第 \(i\) 个位置,可以每次进行 \(Rotate[a_{pos-2},a_{pos-1},a_{pos}]\) ,如果最后 \(pos=i+1\) 了,那么进行两次 \(Rotate[a_i,a_{i+1},a_{i+2}]\) 即可。
序列也类似,我们把每个 \(a_i\) 看成二元组 \((a_i,i)\) ,那么每个数都变成了不同的数。有如下结论:如果存在 \(a_i=a_j(i ≠j)\) , 那么答案一定有解。
我们将二元组排序,并记录 \(p[id] = i\) ,表示 \(a_{id}\) 从小到大排第 \(i\) 位。如果逆序对数为奇数,则可以选这个 \(a_i,a_{i+1}\) ,将它们调换顺序,逆序对数减一,变为偶数。
接下来类似贪心去做即可。
复杂度 \(O(n^2)\)
代码:link
\(CF1373F\)
给定 \(n\) 个城市(围成一个环)和 \(1\) 个首都,首都会给第 \(i\) 个城市的发电站提供 \(b_i\) 能量。
第 \(i\) 个城市可以将这 \(b_i\) 电量分给第 \(i\) 和 \(i+1\) 个城市,特别地,第 \(n\) 个城市可以给第 \(n\) 和 \(1\) 个城市。
问是否存在一种分配方案,满足第 \(i\) 个城市分配到的电量至少为 \(a_i\)
\(2\le n\le 10^6\)
Solution
法一.差分约束
设第 \(i\) 个城市给了自己 \(x_i\) 容量。
则有 \(x_i + (b_{i-1} - x_{i-1}) \ge a_i\) ,移项得 \(x_i \ge x_{i-1} + a_i - b_{i-1}\) 。
由于 \(x_i > 0\) ,故建立一个超级源,连向 \(i\) 点,表示 \(x_{S} \ge x_{i} + 0\)
跑完后判断每个 \(x_i\) 是否均 \(\le b_i\) 即可。
时间复杂度: \(O(能过)\) ,实测接近 \(O(nlogn)\)
法二.二分
我们二分第 \(1\) 个城市给了自己的容量数。
显然,如果二分值过小,那么会导致自己没法达到 \(a_1\) ;
如果二分值过大,那么会导致其他城市没法达到容量。
相应调整即可,如果二分值刚好满足,则输出 \(\texttt{YES}\)
时间复杂度: \(O(nlogn)\)
法三.特殊图的性质
设第 \(i\) 个城市给了第 \(i+1\) 个城市 \(x_i\) 容量。
则有 \((b_i - x_i) + x_{i-1} \ge a_i\) ,移项得 \(x_{i-1} \ge x_i + a_i - b_{i-1}\) 。
由于 \(0\le x_i\le b_i\) ,所以 \(x_{i} \ge x_{S} + 0, x_{S} \ge x_{i} + b_i\)
所以你会发现,如果出现了环,要么就是外面一轮导致的,即 \(\sum_{i} a_i > \sum_{i} b_i\)
或者是一个从 \(S\) 出发的外轮一个点,然后在外轮走了一段最后回到 \(S\) 的一条路径。
那么我们可以计算 \(\texttt{sum += a[i % n + 1] - b[i % n + 1]}\) ,然后记录 \(\texttt{cur = min(cur, sum + b[i % n + 1])}\) ,则如果出现了 \(\texttt{sum - cur > 0}\) (类似差分得到一条正环),即出现了正环,那么无解。
时间复杂度: \(O(n)\)
代码:link
\(CF1373G\)
给定一个 \(n\) 行 \(n\) 列的棋盘,棋盘从底到顶依次为 \(y=1,2,...,n\) ,从左到右依次为 \(x=1,2,...,n\)
一个棋盘是好的当且仅当所有的棋子都在第 \(k\) 列上。一个棋子可以从 \((x,y)\) 跳到 \((x-1,y+1),(x,y+1),(x+1,y+1)\) 。
有 \(m\) 次操作,每次加一个在 \((x,y)\) 上的点,如果 \((x,y)\) 上已经有点,则两个点同时删去。
问每次操作后,前 \(i\) 个存在的棋子需要至少添加几行,使得棋子不重叠,且棋盘是好的。
\(1\le n,m\le 2\times 10^5\)
Solution
一个棋子 \((x,y)\) 到第 \(k\) 列最少要在 \(least=y+abs(x-k)\) 行。
那么 \((x,y)\) 连向 \([least, ans]\) ,我们要求这个二分图的完美匹配。
由 \(Hall\) 定理可知,假设每个 \(cnt[least]++\) ,那么对于任意的 \([i,S]\) ,均有 \(cnt[i + 1, S] \le S-i+1\) 。
移项得到 \(cnt[i + 1, S]+i-1\le S\) ,线段树维护即可。
时间复杂度: \(O(nlogn)\)
\(CF1370E\)
给定两个 \(01\) 串 \(s\) 和 \(t\) ,每次可以将 \(s\) 的一个子序列循环右移一位。
问将 \(s\) 变为 \(t\) 最小经过几步,无解输出 \(-1\) 。
\(1\le |s|,|t|\le 10^6\)
Solution
首先,如果 \(s_i=t_i\) ,则可以忽略,提取出剩余的 \(s_i\) 。
我们要做的就是将 \(s\) 每一位翻转。
那么贪心考虑每次取的子序列一定是形如 \(010101...\) 或 \(101010...\) 的样子。
因为如果存在连续的 \(00\) 或 \(11\) ,那么它循环右移后并不能使答案更优。
然后考虑一个结论:如果我们将 \(1\) 看成 \(1\) ,\(0\) 看成 \(-1\) ,那么答案等于 \(s\) 的最大子段和的绝对值。
证明(只考虑正的):
\((-1, 1)\) 成对去掉不管,剩余的 \(1\) 中任意两个 \(1\) 不在同一个 \(01\) 串中。
因此最大子段和 \(\ge\) 答案
接下来,每删去一个 \(01\) 串至多能使最大子段和减少 \(1\) 。
因此最大子段和 \(\le\) 答案
得证。
时间复杂度: \(O(n)\)
\(CF1369E\)
有 \(n\) 种不同的菜,第 \(i\) 个菜有 \(w_i\) 份。\(Lee\) 有 \(m\) 个朋友,每个朋友喜欢其中的两道菜 \(x_i,y_i\) 。如果朋友会将两道菜都取走一份,如果这道菜已经取完了则不取,但如果两道菜都取完了他就会吃了 \(Lee\) 。\(Lee\) 不想让自己被吃,所以需要制定一个朋友取菜的顺序 \(id_1,id_2,...,id_m\) ,使得按顺序朋友都有菜可取,否则输出 \(DEAD\) 。
\(1\le n\le 10^5, 1\le m\le 2\times 10^5, 0\le w_i\le 10^6\)
保证 \(x_i ≠ y_i\)
Solution
首先,记 \(s_i\) 表示有多少个朋友包含 \(i\) 这道菜。
如果对于任意的 \(i\) 均满足 \(s_i > w_i\) ,那么一定无解。否则有解。
我们建一个队列,将 \(s_i\le w_i\) 的入队,因为包含 \(i\) 这道菜的人一定可以取 \(i\) 这道菜,所以他们已经满足条件了。将这些人的另外一道菜的 \(s_i\) 减一,并将所有新满足 \(s_{to} \le w_{to}\) 的 \(to\) 入队。
答案在每次队头的时候记录,最后把答案表倒过来输出即可。
时间复杂度:\(O(nlogn)\)
\(CF1369F\)
\(Lee\) 和 \(Ice\ Bear\) 打游戏,这个游戏是连环闯关的,共 \(t\) 关。
每一关给定两个数 \(s\) 和 \(e\) ,表示初始数和目标数。
两人轮流玩游戏,每次一个人可以将 \(s\) 变为 \(s+1\) 或 \(2\times s\),规定谁先使得 \(s > e\) 谁输。
输的那个人在下一轮游戏的时候做先手。
第一轮由 \(Lee\) 当先手,最后一轮的胜负决定谁是胜者。
输出两个整数(\(0\) / \(1\)),表示 \(Lee\) 他是否有必胜策略和必败策略。
\(1\le t\le 10^5, 1\le s\le e\le 10^{18}\)
Solution
定义 \(win[s][e]\) 表示一开始的数为 \(s\) , \(Lee\) 是否有必胜策略(\(1\) / \(0\))
定义 \(lose[s][e]\) 表示一开始的数为 \(s\) , \(Lee\) 是否有必败策略(\(1\) / \(0\))
接下来进行分类讨论:
- 对于 \(win\) :
当 \(e\) 为奇数时,显然,如果 \(s\) 为奇数,则对方始终可以保持 \(e-s\) 为偶数, \(Lee\) 必败,否则同理,必胜;
当 \(e\) 为偶数时,
若 \(\lfloor \frac{e}{2}\rfloor < s\le e\) ,则若 \(s\) 为奇数,必胜,否则必败;
若 \(\lfloor \frac{e}{4}\rfloor < s\le \lfloor \frac{e}{2} \rfloor\) ,则必胜;
否则, \(s\le \lfloor \frac{e}{4}\rfloor\) ,那么答案为 \(win[s][\frac{e}{4}]\),因为对方先 \(> \frac{e}{4}\) 我就有必胜策略。 - 对于 \(lose\) :
若 \(2\times s\ge e\) ,则有必败策略;
否则,答案为 \(win[s][\frac{e}{2}]\) ,因为对方先 \(>\frac{e}{2}\) 我就有必败策略。
那么,我们可以预处理出这 \(t\) 轮, \(Lee\) 的必胜必败情况。
接下来模拟游戏流程即可,具体实现见代码。
时间复杂度:\(O(tlog值域)\)
代码:link
\(CF1368E\)
有 \(n\) 个顶点, \(m\) 条长度为 \(1\) 的有向边 \((u,v)\) ,均满足 \(u<v\) (原图不存在环)。保证每个点的出度不超过 \(2\)。
你需要从中删除不超过 \(\frac{4n}{7}\) 个顶点,使得图中不存在任何一条长度超过 \(1\) 的可达路径。
\(1\le n\le 2\times 10^5\)
Solution
非常妙的一种构造方式。
考虑构造三个顶点集合 \(\{ A,B,C\}\) ,方式如下:
先把所有入度为 \(0\) 的点放入 \(A\) ;
把至少有一个入边来自 \(A\) ,且无入边来自 \(B\) 的点放入 \(B\) ;
把至少有一个入边来自 \(B\) 的点放入 \(C\);
剩余的点只可能是所有的入边均来自 \(C\) ,将这些点放入 \(A\)
显然 \(A,B,C\) 两两不相交,且三者并集为全集,所以这是一个合法的划分。
删除 \(C\) 集合,则因为 \(A\) 无入边(要不入度为 \(0\) 或入度全来自 \(C\) ,而现在 \(C\) 删掉了所以入度也变为 \(0\) 了), \(B\) 内部无连边,只有 \(A\) 连向 \(B\) 的边,故不存在长度超过 \(1\) 的路径。
由于每个点的出度不超过 \(2\) ,所以 \(2|A|\ge |B|,\ 2|B|\ge |C|\) ,因此 \(4|A|\ge 2|B|\ge |C|\) ,故 \(|C|\le \frac{4n}{7}\) ,符合条件。
因此删除的 \(C\) 顶点集合记为所求答案。
时间复杂度: \(O(n)\)
\(CF1367F2\)
给定你一个长度为 \(n\) 的序列 \(a\) (数可能重复),你可以执行以下两种操作:
- 选择一个 \(1\le i\le n\) ,将 \(a_i\) 移到序列的最左边
- 选择一个 \(1\le i\le n\) ,将 \(a_i\) 移到序列的最右边
请你求出最少的移动次数,使得序列有序(不下降排列)。
\(1\le n\le 2\times 10^5, 0\le a_i\le 10^9\)
Solution
显然 \(a_i\) 的大小不重要,所以先离散化。
显然每个数最多被移动一次,因为只有最后一次移动影响这个数的位置。所以我要选取尽可能多的不动的数,那么剩余数的个数就是要移动的次数。
故我们要选择一段数值相邻且不递减的序列(因为这个区间内部没法再有其他数插入),有如下 \(3\) 种情况:
- 这个区间全是相同的数,那么它没有什么特殊限制
- 这个区间有两种数值的数,那么它只需满足下标递增即可,个数无限制;
- 这个区间有至少三种数值的数,那么它的最小数和最大数个数无限制,中间的数必须全部取,如果不取那么后面这些数就没法排进来了。
因此,我们设计如下 \(dp\)
\(dp[i][0]\) 表示只有相同数字,以 \(a_i\) 结尾的最长序列
\(dp[i][1]\) 表示 \(a_i\) 没取完,以 \(a_i\) 结尾的最长序列
\(dp[i][2]\) 表示 \(a_i\) 取完,以 \(a_i\) 结尾的最长序列
转移见代码,本题难度较大。
时间复杂度:\(O(nlogn)\)
代码:(\(fir[i]\)表示\(i\)第一次出现的位置,\(lst[i]\)表示\(i\)最后一次出现的位置,\(pre[i]\)表示\(i\)上一次的位置)
link
\(CF1365G\)
这是一道 交互题 。
有一个固定的长度为 \(n\) 的数组 \(a\) ,定义数组 \(b\) ,其中 \(b_i = or_{j=1}^{n} a_j (j≠i)\) 。
你只知道 \(n\) 的值,你每次可以询问 \(?\ c\ q_1,q_2,...,q_c\) 表示询问 \(or_{i=1}^{c} a_{q_i}\) 的值。
你需要在不超过 \(13\) 次询问下求出 \(b\) 数组。
\(2\le n\le 1000, a_i \in [0, 2^{63}-1]\)
CF1236F Alice and the Cactus
给定一棵 \(n\) 个点 \(m\) 条边的边仙人掌,每个点均有 \(\frac{1}{2}\) 的概率消失,求期望连通块数的方差,对 \(10^9+7\) 取模。
\(1\le n\le 5\times 10^5,n-1\le m\le 5\times 10^5\) ,保证图连通。
Solution
设点数 \(v\) ,边数 \(e\) ,环数 \(c\) ,连通块数 \(x\) ,仙人掌中有 \(v-e+c=x\) ,由期望线性性:
接下来依次分析这 \(6\) 个期望:
-
\(E(v^2)\):枚举两个点 \(v_1,v_2\)
- 若 \(v_1=v_2\) ,则概率为 \(\frac{1}{2}\) ;
- 若 \(v_1\neq v_2\) ,则概率为 \(\frac{1}{4}\) 。
故 \(E(v^2)=\frac{n(n+1)}{4}\)
-
\(E(e^2)\):枚举两条边 \(e_1,e_2\)
- 若 \(e_1=e_2\) ,则概率为 \(\frac{1}{4}\) ;
- 若 \(e_1\) 和 \(e_2\) 共端点,则概率为 \(\frac{1}{8}\) ;
- 否则概率为 \(\frac{1}{16}\) 。
记录每个点的 deg 即可。
-
\(E(c^2)\):枚举两个环 \(c_1,c_2\)
设共有 \(cnt\) 个环,环 \(i\) 的大小为 \(sz_i\) ,存在的概率记为 \(P_i=\frac{1}{2^{sz_i}}\)
- 若 \(c_1=c_2\) ,则概率为 \(P_{c_1}\) ;
- 若 \(c_1\) 和 \(c_2\) 共点,则概率为 \(2P_{c_1}P_{c_2}\) ;
- 否则,概率为 \(P_{c_1}P_{c_2}\) 。
-
\(E(ve)\):枚举点和边 \(v,e\) :
- 若 \(v\) 是 \(e\) 的一个端点,则概率为 \(\frac{1}{4}\) ;
- 否则,概率为 \(\frac{1}{8}\) 。
-
\(E(vc)\):枚举点和环 \(v,c\) :
- 若 \(v\) 在 \(c\) 上,则概率为 \(P_c\) ;
- 否则,概率为 \(\frac{P_c}{2}\) 。
-
\(E(ec)\) :枚举边和环 \(e,c\) :
- 若 \(e\) 在 \(c\) 上,则概率为 \(P_c\) ;
- 若 \(e\) 和 \(c\) 有交点,则概率为 $ \frac{P_c}{2}$ ;
- 否则,概率为 \(\frac{P_c}{4}\) 。
时间复杂度 \(\mathcal O(n)\) 。