日志 | 2025.7
-
250701
上午继续复习启发式合并
CF600E
给定一棵以\(1\)为根的有根树,每个节点有对应的颜色,称一个子树内出现次数最多的颜色为该子树的主导色(可以有多个主导色),求每个点对应的子树的主导色之和.
暴力做法为遍历每个子树,统计出现颜色的数量计算答案,每次计算新的子树时需清空答案。发现每次遍历到的最后一棵子树时无需清空,可直接将答案加入下一个点中。所以考虑启发式合并,每次留下不清空的就是重儿子。
CF1996F
每次相减后的数可成为一个等差数列,二分求出在\(k\)范围内最小的\(x\),计算答案。
CF1996G
每次枚举删哪条边,发现路径固定,标记必须走的边,线段树动态维护标记。
-
250702
上午复习了倍增 写了几道模板题
下午完成\(CF2106\) 前四题大概用了一个半小时
CF2106E
-
250703
下午完成\(CF2121\)
前三题大致花了四十分钟左右,\(C\)题一开始思路错了,实际上就枚举十字计算是否所有最大值都在十字中
CF2121D
先对\(a,\) \(b\)两个序列进行冒泡排序,\(n\)最大值为\(40\),所以最多花费\(\frac{n(n-1)}{2} \times 2 = 1560\)次。然后若\(a_i > b_i\),则交换二者。可证明交换操作不会影响两序列的单调性。
CF2121E
贪心,如果当前位上\(b\)的数字与\(a\)的数字相差大于\(1\),则当前位及后面位上对答案的贡献都为\(0\),不用继续考虑了。如果相差等于\(1\),则当前位的答案为\(1\),此时需要考虑后面位,如果后面为\(l,r\)分别为\(0,9\),例如\(39,40\),则对答案贡献为\(1\),否则后面位置一定可以找到与\(l,r\)数字均不同的数字。
也可以数位\(dp\)。
CF2121F
两个限制。总和小于\(s\)可用前缀和,若当前前缀和为\(a\),则累计\(s-a\)的出现次数,用\(map\)记录前缀和,若大于\(x\)就清空。
-
250704
上午复习数位\(dp\),完成\(P2657\)以及\(P4124\)
下午完成\(CF2123\)
前三题大致花费\(45min\)。\(B\)题一开始想的是模拟,后面才想到\(k = 1\)时只需要判断\(a_j\)是否为最大值,总共写了\(25min\)。
\(C\)题关于计算前缀最小,后缀最大的结论想的比较快但没有仔细分析,大致花费\(15min\)。对于每种情况要全面分析,思考是否有反例。
\(D\)题耗时\(35min\)
样例推了很久,加上想思路大概半小时。
CF2123E
耗时\(42min\)
发现直接考虑删\(k\)个数能有多少种不同的\(MEX\)比较麻烦(可先枚举\(k\),后面发现答案计算与\(k\)没什么关系)考虑求对于\(MEX=a\)可以删的数的个数。
记\(s_i\)为\(i\)在数组中出现的次数,对于一个为\(a\)的\(MEX\)(要求所有小于\(a\)的数在数组中均有出现),达成该局面最少删的个数即为\(s_a\),最多的个数即为\(n - a\),所有在该区间范围内的\(k\)答案都可\(+1\),差分统计即可.
-
250705
上午继续复习数位dp,下午补了一下前几天没写的题目。
CF2123F
1的答案一定为1,将每个质数及其倍数的集合,其中所有数的答案变为集合中后一个数,最后一个数则变为第一个数。大致用时
\(30min\)。CF2123G
知道做法后也写了一个小时左右,观察到有同余的性质,对于每个查询k的操作都先预处理出答案,一个修改操作只会影响前后一个位置的答案。
-
250707
上午学习博弈\(dp\),完成\(AT\)_\(dpx\), \(CF859C\)
下午完成\(CF2117\)
前三题大致花费\(45min\),\(C\)题关于如何判断当前位置是否包含之前出现的数字想了一会,后面想到用\(set\)进行去重,还需熟练提升速度。
CF2117D
花费\(30min\),两种操作各进行一次则是对每个元素减去\(n+1\), 符合要求的数组应是一个等差数列,公差则为操作\(1/2\)单独进行的次数,分别进行验证查看是否符合要求即可。
CF2117E
总花费\(60min\),思路想了比较久,对于每个位置\(i\),若满足\(a_i = a_{i + 1}\), \(a_i = b_i\),\(b_i = b_{i + 1}\)其中之一或\(a_i, b_i\)在任意一个数组中\([i + 2, n]\)的位置出现过即能将\([1, i]\)处所有值修改为一样的数,答案为\(i\)。所以从后往前判断每个位置,对判断完后对\(j \in [i + 1,n]\)出现的\(a_j, b_j\)进行标记。
CF2117F
先考虑叶节点,按照题目要求所有\(s\)值不能重复,且\(a\)只能取\(1\)或\(2\),所以叶节点最多只有\(2\)个,分类讨论。
如果只有一个叶子,即整棵树为一条链,则总方案书即为\(2^n\)。
如果有两个叶子,则需要进一步分讨,令两节点分别为\(l, r\),\(dep_i\)表示节点\(i\)的深度,假设\(dep_l > dep_r\)(小于同理).
若\(l\)的值为\(1\),则从上至下第\(dep_r + 1\)个点只能填\(2\).总方案为\(2 ^ {dep_l - dep_r - 1}\)
若\(l\)的值为\(2\),则其他点没有限制,总方案为\(2 ^ { dep_l - dep_r}\)
所以对于有两个叶子的情况,总方案为$2 ^ {dep_{lca}} \times (2 ^ {dep_l - dep_r} + 2 ^ {dep_l - dep_r - 1}) $
- 当树形\(dp\)等时候应按照从叶节点至根节点考虑
- 从叶节点入手,画图,对多种情况进行分析尝试
CF2117G
有点类似最小生成树的做法,将边按\(w\)排序,从小到大加边,每次合并判断\(1, n\)是否在同一块中,计算答案。总共花费\(25min\)。
-
250708
上午练习博弈\(dp\), 完成\(CF1860C\), \(CF1987D\)
下午完成\(CF2114\)
CF1987D
对于\(Alice\),每款蛋糕只需要也只能拿一个即能达到拿尽可能多的蛋糕的目的,而\(Bob\)的目的是让\(Alice\)尽量少拿,所以他必须将价值相同的一款蛋糕全部拿走才能达到该目的。
所以\(Alice\)的最佳策略即为每次按照递增的顺序选择蛋糕,而如果有相同价值的蛋糕时\(Bob\)则可以选择保留该次机会,让\(Alice\)拿走这款蛋糕或者当机会积攒足够后将这款蛋糕全部拿走,由于要求同时最优,所以采用\(dp\),设\(dp_{i,j}\)表示考虑前\(i\)款蛋糕,\(Bob\)积攒了\(j\)次机会,分两种情况转移即可,注意边界处理。
下午完成\(CF2114\)
前三题总共花费\(45min\),\(D\)题写了\(43min\),\(E\)题写了\(35min\),总体速度还行,前三题速度还需加快。
- 序列中删除一个点:常用统计前/后缀进行处理
- 序列中删除两个点:常用\(ST\)表处理
CF2114F
\(x\times a\)的范围过大不好控制,考虑将\(x\times a\)的操作变为\(y\div a\),所以题目转变为给定\(x,y\),每次可选择\(a \in [1, k]\)进行\(x / a\) 或\(y / a\)的操作,求使得\(x = y\)的最小操作次数,容易发现最后相等的值即为\(g = gcd(x,y)\),便可以再次转化为将\(g\)通过不断\(g \times a, a\in[1,k]\)的操作变为\(x\)或\(y\) 的最小操作次数,\(dp\)求解即可。
-
250709
上午继续复习博弈\(dp\), 完成\(CF1033C\)和\(abc413f\)
CF1033C
下午完成\(CF2093\)
前三题比较简单,耗时\(35min\), \(B\)题想了一下是不是只剩一个非零字符的时候答案最佳。
\(D\)题大概就是每次分四块区域递归,思路比较容易,因为\(long long\)和左移符号的优先级调了很久,花费\(53min\),下次要注意,其实也可以提前处理出\(2\)的次幂就不用考虑优先级,要不要加括号的问题。
\(E\)题做法为二分,单调性的证明即为证明\(k\)减小时两段的答案会不会更优。
CF2093F
给定要求的字符串数组和初始的字符串数组,其中初始数组中包含部分要求的。 选择一个与目标相近的值,每次修改。
-
250710
上午学习\(01trie\), 完成\(P4551\), \(CF706D\)
下午完成\(CF2091\)
前三题较容易,用时\(40min\)
\(D\)题做法为二分答案,每次判断最长位置为\(p\)时能否坐下\(k\)个人,用时\(25min\)
\(E\)题可将\(F(a, b)\)转化为\(\frac{a}{gcd(a,b)} \times \frac{b}{gcd(a, b)}\),由于\(F(a, b)\)为质数,即仅有\(1\)和本身两个约数。对于质数\(p, p \le n\),对答案的贡献即为\(n / p\),所以可进行预处理,筛出\(1\)至\(1e7\)内所有质数,每次计算答案即可。用时\(45min\)
\(F\)题做法为\(dp\),设\(dp_{i,j}\)表示当前在点\((i, j)\),可到终点路径的数量。一个点可由同一层或下一层两种不同方式转移而来,可用前缀进行优化。
\(G\)题观察到\(s\)很大但\(k\)很小,发现对于\(s \ge k^2\)的情况答案为\(k\)或\(k-2\)。只需分析 \(s < k^2\)的情况,可直接\(dp\)。设\(f(i, j)\) 表示步长为\(i\)时能否走到\(j\),分跳跃的正反方向转移即可。
- 对于类似这种\(s\)很大但\(k\)很小的情况,考虑\(s\)较大时存在通解。
-
250711
上午继续学习\(01trie\),完成\(CF1785D\),\(CF1851F\)
下午完成\(CF2060\)
前三题总共用时\(45min\)左右,还可加快速度。
\(D\)题为贪心,由于题目要求构造不增序列,所以要求前面的数尽可能小,对于每个\(a_i\),将值变为\(a_i - a_{i - 1}\)即为最小值,若修改前\(a_i < a_{i - 1}\)则无解,因为前面的数已经尽可能达到最小了。大致思考了\(25min\),总耗时\(40min\)
\(E\)题可先用并查集维护每次加边,删边操作不好进行便可对比两张图算出多出的边数减去,用时\(35min\)。
\(F\)题,可先算出不含\(1\)时的序列方案,考虑\(dp\),设\(dp(i,j)\)表示序列乘积为\(i\),不含\(1\)的数个数为\(j\)的方案数,每次转移则枚举新添加的数\(y\),并且\(y \times i \le k\),复杂度在限制范围内。
接着考虑将\(1\)插入序列中的方案数,\(1\)可以插至序列中任意位置,令序列长度为\(l\),非\(1\)的数数量为\(i\),即在\(l\)个位置中选\(l - i\)处插入\(1\),方案数为\(C(l - i, i)\)。所以对于每个长度\(l\),方案数即为\(sum_l=\sum_{i = 0}^{l} C(l - i, i) \times dp_{i, j}\)。
对于组合数的计算,由于\(n\)较大所以不能用阶乘计算,但\(l\)较小,可直接暴力计算。
-
250712
上午继续复习\(01trie\), 完成\(CF1851F\),\(CF923C\)
下午完成\(CF2074\)
前三题总共用时\(50min\),第三题做的时候有点困难,实际上就是位运算,构造满足\(x-y < x ⊕ y <x +y\)的\(y\),并检验\(y<x\)即可.
\(D\)题由于\(m\)的和较小,所以可直接暴力计算,用\(map\)记录每一列的最大值即可,总共用时约\(35min\)
\(E\)题没有想到做法,正确做法可用随机数,设所选三角形内隐藏点的个数为\(s\),\(x,y,z\)三点与\(p\)组成的三角形一定有一个三角形包含的点数\(\le \frac{s-1}{3}\),取到该点的期望次数符合题目要求范围.
-
250721
A
思路想了比较久,大约\(1h\)左右。实际只需要按从高到低的顺序考虑答案每一位是否可以填\(0\)。先判断位置\(1\),\(n\)是否合法,如果一位可以填\(0\),则要求所有选出的数该位均为\(0\),枚举每个数,维护从第一个数开始可行的范围,用\(p\)记录最大范围,并判断该数要求的位置上是否为\(0\),只有为\(0\)才继续维护。若当前位置\(i\)符合要求,将\(i + a_i\)与\(p\)取\(max\),更新\(p\)的值,最后判断能否到达位置\(n\)。
B
思考时间约为\(35min\),按照\(n\)的大小分类讨论即可。\(n = 3\)时需特别考虑.
C
每次减去的和为偶数,所以若原序列的和为奇数则无解。另外若最大值大于和的一半,则操作时会出现负数情况,也无解。剩下的就判断是否存在刚好能使得序列的位置。
-
250722
惨烈.
A
期望:\(100\) \(\quad\) 实际:\(40\)
先写的\(70\)分,答案计算方式有误,还有数组清空只清空了\(1\) ~ \(n\),但\(n + 1\)位对计算答案有影响,于是挂到暴力,\(100\)分同样有该问题。
正确做法其实比较简单,用单调栈预处理出第一个大于\(a_i\)的数的位置\(p_i\),然后对于每个位置\(i\),该位置上的答案即为\(s_i = n - i + 1 + s_{p_i}\).式子比较好推,应加快反应速度。
B
期望:\(0\)~\(20\) \(\quad\) 实际:\(0\)
一开始没有看到\(x \ne T_i\)的限制,写了三方暴力,发现问题后思考了一会不会处理就先看后面的去了。后面想到了即要求\(s\)序列最开始连续一段的长度(开头长度)\(\le\) \(T\)的开头长度,打了暴力但边界处理存在问题,并且是捆绑所以全挂了。
首先序列\(T\)与\(s\)符合题目要求必须满足:
\(T\)为\(s\)的子序列,\(s_1 = t_1\),\(s\)的开头长度
\(\le\) \(T\)的开头长度对于第一个要求,按顺序对\(T_i\)在\(s\)中进行匹配,找到最后一个匹配的位置\(p\),\(s_p = t_m\),该限制下的答案即为\(n - p + 1\)(还要考虑其他限制).由于\(m\)较小,可直接预处理.
对于第三个要求,需分类讨论
若在匹配到的\(T\)和\(s\)中,\(s\)的开头长度已经大于\(T\)的长度,则不合法
若开头长度刚好相等,则需判断若前\(m\)个元素均有\(s_i = T_i\)且\(T_1\)~\(T_m\)均相等,此时若\(s_{m+1} = s_m\)则不合法
C
期望:\(20\) \(\quad\) 实际:\(20\)
看完题目后只能想到\(O(n^3)\)暴力。
专题D2 A
思考大约\(10min\),每次选择的数必须是最大值加上一个数,因为如果选择次大值加第三大的数作为和,则会使得下次最大值无法和另一个数进行匹配,\(set\)维护即可。
总结
仔细看题避免看错题浪费时间,对于过了大样例的程序也要多测几组确保正确。
有思路时即使是暴力也要多想几遍,不要想一出是一出,如\(B\)题暴力调了二十多分钟后才发现思路问题。
-
250723
主要练习了线段树,完成\(CF2108D, CF1690G,CF1913D,P7706\)
A
设原排列为\(p\),当前已找到\(x\)所在位置,对于\(s_i\),若\(s_i \ne 0\),则说明前面有小于\(p_i\)的数,该位置部为\(x\),若\(s_i = 0\)且是序列中最后一个的\(0\)所在位置,那么\(p_i = x\)。每次找到一个新的数所对位置后,将后面的\(s_i\)均减去该数,重复查找过程,对于区间修改和查找操作可用线段树维护。
B
开始想的是线段树,但其实也可以用\(set\)。
\(set\)维护每个车头,修改操作时对于车厢\(k\),便利后面所有的车头\(x\),若\(a_x \ge a_k - d\),则\(x\)将不再为车头。再与最近一节车头\(y\)进行比较,若\(a_y < a_k - d\),则\(y\)将不再为车头。
E
单点修改和区间查询,可用线段树实现
对于\(ψ\)的维护,可分为维护左儿子\(ψ\)的最大值、右儿子\(ψ\)的最大值、 左儿子 \(a_i - b_j\)的最大值且满足 \(i < j\) 最大值加上右儿子\(a_k\)最大值、右儿子 \(a_k - b_j\)的最大值且满足 $j < k $ 最大值加上左儿子\(a_i\)最大值
-
250724
继续复习线段树,完成\(CF2000H\)
之前看过这题但是没写出来,所以还有点印象。从小到大找到第一个相邻两数差大于 \(k\) 的位置。左边连续的 \(0\) 个数,右边连续的\(0\) 个数,区间内最多的连续 \(0\) 个数。询问时二分查找即可。
-
250725
A
很基础的题目,但是因为前后缀计算时边界的问题再次挂分。并且关于最大子段和的计算未能及时反应耽误了时间,非常不应该。
B
考试的时候单纯从每个玩偶丢掉的数量来思考,不知道如何同时不会写暴力,但其实做法显而易见就是枚举每个玩偶作为最大的玩偶,将所有尺寸比它大的删去,设该尺寸的玩偶数量为\(s\),因为要求损失尽可能小,所以所有尺寸小于它的保留\(s-1\)个,可直接\(O(n^2)\)暴力计算。
关于优化,可以用线段树维护玩偶的价格和个数的前缀,设当前最大尺寸为\(v\),则对于所有尺寸小于\(v\)的玩偶,二分查找\(s - 1\)所在之处。
C
想写给出的是一条链的情况,但是没想出来起落和向前走同时的问题怎么处理。
其实仔细分析也不是很难。题目只规定了到一个点的最低高度,所以重复的上升下降再上升的过程是无意义的,故飞行过程即是一个先一直上升,中间可能有一次平飞(根据奇偶性,可画图分析),接着持续下降的过程。
先考虑前一段上升过程,设由\(1\)出发到达点\(u\)的最小时间为\(f_u\),遍历所有连接到\(u\)的边,对于边\(v \rightarrow u\), 所需时间为\(max(f_v + 1, a_u)\), (走一条边需耗费\(1\)时间,若未达到\(u\)限制高度还需在\(v\)出停留上升至对应高度),求所有转移计算的时间的最小值,可用\(dijskra\)。
下降的过程同样如此,只是反过来了而已,所以分别求出由\(1\)和\(n\)出发到达点\(i\)的最短时间,枚举最中间的那个点或边,计算答案,若中间的为点,则答案为\(max(f1_u, f2_u)\),若为边则是\(max(f1_u,f2_v)+ 1\)。
D
前\(35\)分数据特点十分明显,直接特判加搜索即可。
总结
这次发挥的依旧很差,暴露的还是部分很基础的细节和思路相关的问题。
\(T1\)大部分时候都比较容易,做法也很简单,不要想复杂,主要注意边界等基础细节问题。
像\(T2\)这种,暴力的做法是十分明显好想的,并且正解也是在暴力的基础上优化的,考试时不要一眼不会就放弃,从题目中给出的部分分数据大小进行思考,换个角度入手。下次类似这种题不应再犯思路上的问题。
\(T3\)关键是发现它的飞行过程是一个对称的,但其实这一步没有特别困难。所以对于完全没有想法的题,也要留出时间,分析样例进行尝试,长时间耗在一个题上反而会使得思路发生混乱干出一些诡异的操作。
-
250726
今天主要复习字符串。
CF176B
先计算出\(s\)中操作一次就能变为\(t\)的位置数量\(sum\),可直接暴力或\(kmp\)计算。然后设\(f_{i,0/1}\)表示操作\(i\)次变为\(t\)串/其他串的方案数。对于转移有四种方式分别是其他串->目标串,目标串->其他串,目标串->目标串,其他串->其他串,分情况计算即可。
P4824
主要需要处理删除后会新产生字符串的情况,考虑用栈维护,在正常做\(kmp\)的过程中,将遍历到的下表\(i\)入栈,当匹配上\(B\)时,继续从栈顶所能匹配到的最大位置出开始匹配。
-
250727
A
期望:\(60\) \(\quad\) 实际:\(60\)
考试时知道答案怎么算,即对于两个数\(x,y\),如果二进制下两个数有至少一个相同的位均为\(1\)则\(f(x, y) = 2\),否则\(f(x, y) = 1\),但不会\(O(n)\)求。
正确做法时预处理出每个为\(1\)的数位集合,集合大小最大为\(4\),可用\(map\)记录,\(mp[\){\(a_1, a_2.....\)}\(]\)表示为\(1\)的数位至少包含该集合的数的个数,对于每个数\(a_i\),可用容斥计算与该数至少有一个相同的为均为\(1\)的数的数量,再加上无相同数位的数的数量计算答案。
B
期望:\(40\) \(\quad\) 实际:\(25\)
除了三方暴力还写了\(k = 2\)的部分分来着,结果少判了情况。
正确做法其实就是分讨。
设连续的长度\(\ge k\)的段数量为\(c\).
若\(c \ge 3\)则答案为\(no\),因为一次的操作最多分割\(2\)段长度\(\ge k\)的段,若大于\(2\)则会有一段不合法的段长度没有发生变化。
当 \(c = 0\) 时显然是合法的,可直接输出\(Yes\).
对于剩下的情况,首先对于所有不合法的段,设长度为\(l\),必须满足\(k \le l < 2k - 1\),否则不管如何分割都会有一段长度至少为\(k\),答案为\(No\).
若 \(c = 1\),即只有一段不合法,设该连续段均为\(A\),
若存在一段长度\(> 1\)的\(B\),或者存在一段连续的长度为\(l2\)的\(A\)满足\(l + l2 < 2k - 1\),则可以满足条件。若\(c = 2\),若两段分别是\(A\),\(B\)的段,那么可以在两端中间处(或者其他相近的地方)进行反转操作,可消去\(\ge k\)的段,若两段连续的字母相同则无法操作。
总结
今天难度不高,挂了好几个地方的分的同时也有些该写的点没写出来 (
好像有点废话)\(T1\)没有第一时间想到怎么算答案,写完\(a_i\)均为\(2\)的次幂这个部分分后才反应过来的,后面也没有留什么时间想那个容斥。
\(T2\)的分讨也不难,不应该啥都没分析出来,在想\(k = 2\)的部分分时就想到了不合法的段数量必须\(\le 2\)这点,剩下要讨论的就不多了,要继续往下推的。
\(T3T4\)应该还要多写出点部分分的
-
250728
继续完成了前面几天没改完的题目。
-
250729
今天主要练习\(dp\),完成\(CF1324E\),\(CF2000F\),\(CF1557D\)
A
比较容易的\(dp\),设\(dp_{i,j}\)表示前\(i\)个数的和对\(h\)取模的值为\(j\),直接递推即可
B
之前做过一边但是看到还是想了一下,设\(dp_{i,j}\)表示前\(i\)个矩形总分为\(j\)的代价,\(f(x, y)\)表示在第\(x\)个矩形取得\(y\)分的最小代价,贪心预处理\(f(x, y)\)进行转移
C
考虑记 \(f_i\)为以第 i 串结尾的最长美丽串的长度。易得\(f_i = max(f_j + 1)\) 当且仅当第\(i\)串和\(j\)串有相同位的 \(1\).可用线段树维护,值域比较大,需要先离散化.
-
250730
A
期望:\(100\) \(\quad\) 实际:\(100\)
总算把\(T1\)写对了,算出后缀和后再计算后缀\(max\),枚举最低层数\(i\),答案就是每一栋楼的后缀\(max\),但注意有一栋楼需要层数刚好为\(i\),枚举计算最大答案即可。
B
期望:\(30\) \(\quad\) 实际:\(0\)
写了平方暴力,每次维护后缀最大的答案,但是由于负数取模问题导致挂分。
实际上两数相乘的最大值只需要分别考虑两数的最大值和最小值,将\(n\)拆解成二进制形式,通过子集后缀\(max\)计算
总结
部分分还是写的太少了,\(T2\)负数取模的问题不应该犯,\(T3\)对于一个不降序列且只包含\(1,2\)的情况计算的时候关于向上取整的问题出错导致挂分,还是比较细节的基本的错误。
-
250731
今天主要学习组合数,回顾了一些相关知识,完成\(CF1436C, P9306,CF1696E\)
A
之前好像写过但没啥印象了,分析过程比较简单,倒推二分查找的过程,通过目标\(p\)与\(mid\)的关系逆推往左还是往右,设小于\(x\)的数的数量为\(a\),大于\(x\)的数的数量为\(b\),则答案为\(A_{x - 1}^{a} \times A_{n - x} ^ {b} \times A_{n - a - b}^{n - a - b}\)
B
分类讨论。
若存在位置\(i\) , \(p_i = q_i = n\), 则可将这一位同时移到最前面,最小答案即为\(2\),方案则为\((n - 1)!\) (第一位固定,剩下的可随便填)。
若两个排列\(n\)出现的位置不同,则无法将两个\(n\)同时移动到第一位,有一个\(n\)在序列中间的答案必须为\(1\),开头答案最小\(2\),所以最小答案为\(3\)。考虑如何计算方案数。
首先假设将排列 \(p_1 = n\),此时\(q_1 \ne n\),设\(q_{pos1} = n\),要使答案最小,则 对于 $ 1< i < pos$ ,\(q_i\) 所填的数都应该小于 \(q_1\),不然每个位置就会有更大的答案。排列\(q\)的情况同理,设 \(p_{pos2} = n\),总方案为 \(\frac{(n - 1)!}{n - q_1} + \frac{(n - 1)!}{n - p_1}\)
C
本质就是杨辉三角,将杨辉三角写成二维矩阵形式,由于杨辉三角第\(i\)行第\(j\)列中的值为\(C_{i - 1} ^ {j - 1}\),手推可得矩阵中第\(x\)行第\(y\)列的值可表示为\(C_{i - 1}^{j - 1} = C_{x + y - 2}^{y - 1}\) , 设\(f(i,j) = C_{x + y - 2}^{y - 1}\),
则可将题目所求的转化为\(\sum_{i = 1}^{n + 1} \sum_{j = 1} ^ {a_i} f(i, j)\).
继续优化,可证\(f(i + 1,j + 1) = f(i, j + 1) + f(i + 1, j)\),将\(\sum_{j = 1} ^ {a_i} f(i, j)\)拆开可化为
\(\sum_{j = 1} ^ {a_i} f(i, j)\) $= f(i,1)+f(i,2)+⋯ +f(i,a_i) $
\(\quad\) \(\quad\) \(\quad\) \(\quad\) $ =$ \(C_{i - 1}^{0} +f(i,2)+⋯+f(i,a_i)\)
\(\quad\) \(\quad\) \(\quad\) \(\quad\) \(= C_{i}^{0} +f(i,2)+⋯+f(i,a_i)\)
\(\quad\) \(\quad\) \(\quad\) \(\quad\) $ = C_{a_i + i - 1}^{a_i - 1}$
可直接\(O(n)\)求解。

浙公网安备 33010602011771号