2022 CCPC 热身赛
A 简单的排序问题
B 有2n张牌,每张牌有一个数字,1到n每个数字出现2次,这些牌被分成k堆,每次能选两个不同的堆,从堆顶拿走数字相同的两张牌,不能操作者输,告诉你每个堆的牌的排列情况,问先手胜还是后手胜
最终结果唯一 直接模拟即可。
C 给定数组C,$C_i=$0或1,问你有多少个数组对(A,B),满足 \(A_i-B_i\le C_i\) 其中A,B分别是n的一个排列。\(n\le 10^6\)
直接的有一个dp的做法 不过很繁琐。考虑枚举\(A_i=B_i\)的数量又因为其中位置到底有多少个对应\(C_i=0\)还应该枚举导致复杂度过高。
不妨枚举\(A_i=B_i+1\) 然后观察剩余数字有且只有一种配对方式 这样只是一个简单的排列问题。前一部分是一个选出与排列问题 可以O(n)计算。
D 一颗树,有边权 ,问树上一条路径,可以通过一个点或一个边多次,答案为 \(\sum\limits_{i=1}^{n-1}|cnt_i-w_i|\) \(cnt_i\)表示第i条边经过的次数,问答案的最小值。
直接贪心 可以发现由于树的结构与边权不同所以贪心很难具有全局最优性。
考虑dp 虽然不知道起点在哪 但是我们可以在dp的过程中对每个点处求答案 即枚举答案的路径会经过这个点 只要经过了这个点 这个点就可以求出答案的路径。
具体的 可以设 \(f_{x,0}\)表示在x这个节点处不往下走的最小代价 \(f_{x,1}\)表示往下走不回来的最小代价。\(f_{x,2}\)表示往下走回来的最小代价。
\(f_{x,4}\)表示x子树内已经有两个往下走不会来的路径的最小值。\(f_{x,5}\)表示x子树内有一条往下走了一条回到x的路径的最小代价。
根据上述状态容易知道答案可以被求出。
D m个座位,编号为1到m,n组人,第i组人有\(a_i\)个,能坐编号为\(b_i\)的倍数的座位,一个座位最多坐一个人,问全部人能不能坐下。\(n\le 20\)
贪心可不能解决二分图是否具有完备匹配的问题。
n只有20显然是状压 本题是一个赤裸的 霍尔定理的题目 即n的任意子集的候选集合大于子集大小 就一定存在完备匹配。
必要性非常显然。充分性:归纳法 设<n都成立 当=n时 考虑先加入的那个人 是否使得候选集合变大。
下面我称初始子集的元素为男生 候选集合的元素为女生。
如果变大则显然成立。如果不变考虑当前空闲的女生(因为男生有n个 女生>=n个 男生只和n-1个女生匹配了 所以还有空缺) 所连接的若干男生。
存在一名男生 若是让出当前匹配 这个时候出现了增广路 则匹配成功 若未出现增广路则说明将这个男生已经配对的女生删掉其他形成了一个集合 这个配对的女生不影响后续配对。
而后面剩下的n-1个男生是子问题 故n个人情况成立。
这道题就是枚举每个集合 算出这个集合能占多少人判断一下即可。
直接容斥计算是\(3^n\) 考虑每个集合的贡献是固定的 即 -1的系数我们可以提前固定好 这样其实是求自己的子集和。
进而发现是or | 或 卷积 可以利用FWT优化到\(2^n\cdot n\) 可以通过此题。