清华集训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

posted @ 2018-12-03 17:18  探险家Mr.H  阅读(228)  评论(0编辑  收藏  举报