csp-s 模拟 10

csp-s模拟10

T1 欧几里得的噩梦

签到题?

如果会线性基的话 ...

由于位数较多直接上线性基肯定是不行的,但是由于题目给出的数在二进制下位数很少,手动模拟一下一个二进制下只有一位的数插入,发现那些二位的数变为了一条边,最后边指向的位数就是它所插入的位置,考虑二位的数其实本质上是相同的,两位相对独立,两位分别到达最后的位数,若不相等则自己作为一条边加入集合,若相等则不合法,对于只有一位的数可以都将其视为两位,可以看做在 0 位上为 1 (等于是一个虚点了)。用并查集加快这个过程即可。

时间复杂度 \(O(n\alpha(n))\)

T 清扫

结论题

先想想 sub1 即为一个菊花时该怎么做。

对于非叶子结点(根)是什么都不确定,但是叶子结点却是确定的,因为它的度数为 1,只能向上,那么问题转移到在根怎么合并儿子的需求。

这个问题等同于给定一个序列,每次选择两个不同的数同时减少 1,最后是否能恰好都减为 0 。
结论:当且仅当序列的总和为偶数且最大值不超过总和的一半。
这两个限制显然具有必要性,现在证明其充分性。
考虑数学归纳法,现在已有一个序列总和为偶数且最大值不超过总和的一半,那么必然存在一个操作能使下一个局面依旧合法,即每次选择最大和次大,而最终状态显然是一个合法状态,而每次操作总和必然减少,所以一定能到达全为 0 的状态,证毕。

考虑扩展到不是菊花的模型上,因为叶子结点向上的需求依旧是固定的,所以考虑从下往上将信息一步一步的确定,手模一下发现当一个结点儿子的需求已经确定后自己的需求也是确定的,那么就可一套用上面的结论直接做了。

时间复杂度 \(O(n)\)

T 购物

结论题

考虑单个 k 合法的充要条件,显然如果原序列中存在属于 \([k,2k]\) 的数 k 是合法的,而大于 \(2k\) 的数显然是不能选择的,现在考虑小于 \(k\) 的数。结论:当序列中小于 \(k\) 的数之和大于等于 \(k\)\(k\) 是合法的,证明考虑每次随便减少一个数,则最后一定能将和控制到 \([k,2k]\)。那么序列中每种数对应两个区间,总共有 \(O(2n)\) 个区间,计算这些区间的并即可。

时间复杂度瓶颈在排序为 \(O(nlogn)\)

T ants

签到题

直接上序列回滚莫队+值域链表即可。

时间复杂度 \(O(n\sqrt n)\)

p

posted @ 2024-10-10 09:16  Qyun  阅读(29)  评论(4编辑  收藏  举报