[整理]qbxt集训10场考试 大 杂 烩 (前篇)

Contest 1

A

计算 \(n!\mod 2^{32}\) 。发现数一大答案就为 \(0\) ,直接输出即可。

B

一个 \(n\times m\) 的网格,网格中的数都在 \([1,nm]\) 之间且满足 \(A_{i,j}<A{i+1,j},A_{i,j}<A_{i,j+1}\) ,求对于任意 \(k\) ,有多少个格子可能填入 \(k\)
可以预处理出每个格子可填数的范围,然后差分。

C

对于一个排列有三种操作:花费 \(a\) 交换相邻两个数,花费 \(b\) 翻转整个排列,花费 \(c\) 打乱整个排列。问将其排好序的期望花费。
先通过状压处理出每个逆序对数量对应多少种排列,然后求一下每种排列不用打乱操作的花费,这时我们发现,如果使用打乱操作,一定是把某个比较大的后缀打小,求出答案的前缀与后缀即可遍历找出最小值。

D

\(k\) 棵树,对于每对点 \(i,j\) 求出有多少个 \(x\) 在所有树中 \(i\)\(j\) 的路径上。
先考虑一棵树,发现满足条件的点 \(x\) 满足 \(dis_{i,x}+dis_{x,j}=dis_{i,j}\) ,然后通过一番%^#@!%!#*%发现这个式子可以推广到多棵树上,于是就可以预处理距离数组 \(O(1)\) 判定了。

Contest 2

A

\(n\) 个元素划分成若干段,求每段异或和的加和的最值。根据异或的性质得出最小值是全异或起来,最大值是全加起来。

B

在约瑟夫游戏中,指针指到的人出局条件改为 \(p\) 的概率出局,求指针期望移动多少下。
可以设 \(f_n\) 表示 \(n\) 个人期望走几步,易得转移方程 \(f_i=pf_{i-1}+1+(1-p)f_i\) ,即 \(f_n=\frac 1p+f_{n-1}\) ,加起来可得答案 \(\frac np\)

C

实现区间加、区间整除、区间查询最大值和区间恢复初值四个操作。
树里可以存 \(\lfloor\frac{x+a}{b}\rfloor+c\) 三个标记,下传的时候可以优化一下整除,然后,正常线段树。

D

\(2n\) 个数平均分给 \(n\) 个人,求使得两数之和最大值唯一的方案数。
直接做不好求,考虑每个数作为最大值的贡献。
例如,在数列 \(\{1,2,3,4,5,6,7,8,9\}\) 中,假设最大值为 \(12=6\times2=5+7\) ,那么我们发现此时右边的只能和左边匹配(例如 \(9\) 能配 \(1,2\)\(8\) 只能配 \(1,2,3\) 并且其中一个还被 \(9\) 占去了),这样下去直到右边匹配完,方案数是某个常数的幂。选完后左边剩下偶数个数,方案数其实是一个双阶乘。

Contest 3

A

每个物品有重量和价值,总重量为所有重量或起来的和,有一个容量为 \(k\) 的背包,求最大价值。
从最高位分类讨论即可。

B

求最长相邻按位与非零子序列。
直接dp不方便,可以按位dp。参见洛谷P4310 绝世好题。

C

有一些位数相同的十进制数,有些位置被抹去,求把空格填完后所有数单调递增的方案数(原题为数字和)。
可以dp来做:设 \(f_{i,l,r}\) 表示对于 \([l,r]\) 里的数字,第 \(i\) 列以后的方案数。这个状态不太好转移,于是再往里面套一个dp辅助计算,用 \(g_{j,k}\) 表示对于状态 \(i,l,r\) ,考虑完了前 \(j\) 行,当前最大填 \(k\) 的方案数。对于求数字和也是差不多的套路。

D

有一堆石子,每次从石子里取出一些形成另一堆(总共不超过 \(m\) 个),求最小分裂次数。
不好维护,考虑每个石子的状态。每次分裂可以看成给分出来的石子分配1的标号,反之为0,这样每个石子的状态就是一个01串,我们需要使它们不同。接下来发现答案满足单调性,于是二分一个 \(mid\) ,转化成判定是否合法。由题意得,如果合法,则 \(mid\times m\) 能够使得所有串两两不同且1的个数不超过 \(mid\times m\) 。如何证明它也是充分的呢?我们可以通过贪心构造来说明:每次把1往个数少的地方放,最终会变成从 \([1,n]\) 里取若干 \(m\) 元子集使得每个数被取的次数之间的极差 \(\le1\) 。如果不满足条件,则选一个出现太多的 \(i\) ,一个出现太少的 \(j\) ,发现一定有串能满足可以交换这两位,于是完事了。

Contest 4

A

模拟题。

B

有一些字符串,选择一个字符串并任意排序,然后重新定义字典序,使得其余所有字符串排序后都比自己的大,问有多少种选择。
首先可以枚举选择的字符串,然后枚举字典序,使得每个字符在这个字符串里出现均为最多,依次筛掉不合法的即可。

C

求所有逆序对不少于 \(K\) 个的区间交集大小之和。
我们先考虑如何求出这些区间。求出一个刚好满足要求的右端点,然后发现左端点右移,右端点一定右移,于是可以使用树状数组维护个数。答案不好求,按照惯例转化成求贡献,此时答案与覆盖某点的区间有关。经过一顿分析可以发现最终是要求区间加等差数列,用毒瘤数据结构维护。

D

有一棵树,你要从给定的两点进去,挨个节点炸掉它,炸掉的点不能通过,求炸掉所有点的方案数。
对于两点相同的情况,可以直接进行树形dp:设 \(f_i\) 为方案数,则 \(f_u=f_u\times f_{son}\times C_{size_u+size_{son}}^{size_{son}}\) 。若两点不同,则可以把树分成两点之间的部分和这两点的子树。发现两点中间的部分一定是从中间向两端删一个区间,于是可以区间dp,每扩展一个点就把它的子树乘进贡献。

Contest 5

A

有四种颜色的球,要求放成一列且相邻的球颜色不相同,求方案数。(前两种颜色球的数量远小于后两种)
可以把前两种和后两种分开考虑,先dp求出放完前两种之后相邻颜色一样的个数为 \(i\) 的方案数(记作 $f_i)。接下来枚举后两种颜色的放法以及形如343、434、34的数量,最后用排列组合计算出答案。

B

参见洛谷P2123 皇后游戏。

C

请你区间加、区间乘、区间赋值、查询所有区间平均数的和。
前三种操作好说,关键是最后一种。可以拆成每个点对答案的贡献来计算。

D

你可以在一棵树的叶子节点上放毒气,毒气以每秒一单位的速度蔓延,问有多少种不同的使毒气蔓延到整棵树的时间(时间是连续的,例如毒气可以在一条边的中间汇合)。
考虑两个叶子结点之间的时间,发现要么是从一个蔓延到另一个,要么是从两端同时蔓延。于是对于两种情况,分别求出放毒后没有影响的点,同时进行SPFA,看最终结果是否满足条件。

posted @ 2020-12-01 10:10  ajthreac  阅读(183)  评论(0编辑  收藏  举报