清华集训2016 可做题集合
其他的题好像不可做呢 QAQ
我太菜了 QAQ
uoj266 Alice 和 Bob 又在玩游戏
给一个有根树森林,Alice 和 Bob 两个人每次选择一个点 x,删除 x 和 x 所有祖先,不能操作的人输,求赢的是谁
sol:
考虑 SG 函数,如果删除根节点,后继状态就是所有儿子为根的游戏,把它们的 SG 值异或起来即可,如果不删除根节点,那就是删除以那个点为根的子树的根节点,后继状态就是那个子树里 SG 值异或和再异或上外面的 SG 值,那也就是相当于把这一棵子树的 SG 值全体异或上除它以外的所有儿子 SG 函数异或和
暴力转移是 $O(n^2)$ 的,我们用一个数据结构从下往上合并来解决,这个数据结构可以支持整体异或一个值,快速合并,查询 mex
可以用 log 棵线段树模拟 Trie 树,异或就是 Trie 树的异或,mex 就是 Trie 树贪心往左走,合并就把那块的 log 棵线段树合并起来
复杂度 $O(nlogn)$
uoj267 魔法小程序
有一个程序
定义数组 a[], b[], c[] 定义函数 魔法(x, y, z): { 如果 a 的长度 == z: 返回 x >= y 如果 x % a[z] < y % a[z]: 返回 假 返回 魔法(x / a[z], y / a[z], z + 1) } 定义函数 主程序(): { 读入 a[], b[] 令 c[] 的长度与 b[] 的长度相同,且 c[] 的每个元素均为 0 令 变量 i 从 0 循环至 b 的长度 - 1: 令 变量 j 从 0 循环至 i: 如果 魔法(i, j, 0): c[i] += b[j] 输出 a[], c[] }
现在给你 a 数组和 c 数组,求 b 数组
$n \leq 10^6$
sol:noip 初赛题加强版
阅读程序可以发现,这个“魔法”是把两个数转成两个奇怪进制的数 A 和 B,如果 A 的每一位大于 B 的每一位,则 $sum_A += sum_B$
仔细阅读程序可以发现,如果 $\prod_{i=1}^{n}a_i \geq n$ ,则 $a_i$ 和 $a_i$ 往后的都没用了
再发现,这个程序的本质不是进制转换,而是多维前缀和,因为显然,多维前缀和就是“当 A 和 B 满足多维偏序关系时,A 会贡献到 B”
然后发现 A 数组的每一项就是每一维的长度,n 就是多维数组一共有多少个数
显然,长度大于等于 1 的维数不超过 logn 个,我们在最后加入一个长度等于 1 的维,之前等于 1 的就都可以跳过了
之后我们暴力模拟即可
uoj274 温暖会指引我们前行
语文题,题意极端复杂
sol:LCT 动态维护最大生成树即可
维护边权信息可以在边上开一个点,把这个点权当做边的边权
uoj275 组合数问题
求 $i \leq n,j \leq min(i,m)$ 中有多少 $$C_{i}^{j} \space mod \space k = 0$$
$n,m \leq 10^{18},k \leq 100,k$ 是质数
sol:考虑 Lucas 定理
把 i 和 j 都转成 k 进制,组合数在膜意义下为 0 等价于 i 和 j 在 k 进制下某一位相应组合数等于 0
组合数什么时候等于 0 呢?当然是上面比下面大的情况
于是原题就变成了 k 进制下,有多少数对 $(i,j)$ 满足 i 至少有一位小于等于 j $(i \leq n,j \leq min(i,m))$
于是一个数位 dp ,$f_{(i,0/1)}$ 表示前 i 为,是/否已经满足“ i 至少有一位小于等于 j ”的方案数
转移的时候注意,要把每个状态都记下来(反正空间够),要不然复杂度不对,最后要减去 $m \times (m+1) / 2$ 因为上面的方程只考虑到了数位,没有考虑到 $i < j$ 的情况
代码先咕着,明天找老师要(flag