5.14省选组 总结(AHOI2022)
T1
题目所说的过程就是把两个环合起来。
那么把大小相同的环扔到一起算,那不同的环个数就只有 \(O(\sqrt n)\) 个,直接枚举合并哪两个环就行,复杂度是 \(O(n)\) 的。
维护 lcm 就是维护每个质数的最高指数,由于需要删去某个环的贡献,记录一下指数的次大值即可。
T2
钥匙的个数只有 \(5\) 个非常关键,利用这个性质可以建虚树做,还没仔细研究。
T3
乍一看以为跟前两周的 AGC 很像,后来发现完全不一样(
T4
啊啊啊啊啊啊啊啊啊暴力分有60pts呜呜呜呜呜呜
特性B也搞定的话就能72了……
6.6省选组 总结
T1
套了个博弈壳子而已,就是求 \(1\) ~ \(n\) 内质因数为 \(i=1\) ~ \(30\) 的数有多少个。
直接Min25筛。
T2
十万的数据范围,根号算法直接考虑莫队,发现直接莫队的复杂度是不平均的,那么平衡一下复杂度,也即按 \(\sqrt{\sum \frac n i}\) 分块,此时每个块的大小不一样,但是每个块内的操作复杂度是平衡的。
T3
每层设生成函数,显然有 \(F_R(x)=\frac{1}{1-A_R(x)F_{R+1}(x)}\) ,直接维护很慢,而且无法优化,但是可以将 \(F_R(x)\) 写成 \(\frac {B_R(x)}{C_R(x)}\) 的形式,每次转移都是一个简单的线性变换,分治维护矩阵乘法(类似于分治FFT)。
6.7省选组 总结
T1
将 \(a | b\) 和 \(a \oplus b\) 都用 \(a \& b\) 和 \(a+b\) 表示,然后用 FWT ,\(a+b\) 的部分放在系数里, \(a \& b\) 的部分放在指数上。
T2
设 \(v_i\) 为点 \(i\) 连出的所有边的异或和。
根据这是一棵树(不存在环)可以知道最终目的是使 \(v_i\) 全部变为 \(0\) 。
每次操作可以将其中两个(即路径的两个端点)同时异或 \(k\) 。
易证几个结论:
- 每个操作至少会删去一个点,合法且不劣。
- 有两个相同的点一定用一次操作删去。
值域只有 \(15\) 那么就能直接状压了。
T3
直接维护 mex 不好做,考虑维护其补集。
非常套路地使用线段树维护,每个节点都维护一个完整的补集显然是不行的,时间直接爆掉。
那么尝试让补集分散到每个点中,使同一个元素不在有祖先关系的点中出现,这样最大的集合个数就是 \(O(n \log n)\) 的。
维护的话类似标记永久化,每次经过该点时要将此处集合的最小值计入贡献,但是每次在一个集合中删数后要往两个儿子 push ,用维护区间的形式显然是好做一些的。
为了保证时间复杂度额外维护一下当前点没有但后代有的值,用 map 就好。