2024.11.1 test

B

维护长度为二的次幂的数组,支持单点修改,区间和,全局执行以下三种操作之一:

for(int i=0; i<n; i++) b[i]=0;
for(int i=0; i<n; i++) b[i()x]+=a[i];
for(int i=0; i<n; i++) a[i]=b[i];

()里为或,且,异或中的一种。n219

考虑线段树维护。注意到如果为或/且,那么相当于对于某些层的节点左右儿子进行线段树合并。
对于异或操作,相当于交换左右儿子。
那么维护三个 tag 即可。因为每个点只会被并一次所以复杂度是对的。

C

n 个鱼缸,第 i 个鱼缸的水高 hi,鱼缸高 w,有 m 条鱼,初始在某个位置,跳跃能力为 J
i 能跳到相邻的鱼缸的条件是 whiJ。鱼任意跳,问到在一个鱼缸的鱼的对数最多是多少。
n1e4,m200

考虑求出每个鱼能活动的区间,然后离散化后区间 dp。
每次选一个点并把跨越这个点的鱼都聚集在该点,并划分子任务为左右两个区间。

D

给定一张 n 个点,m 条边的简单无向图,对每个 i[0,m],计算它只保留 i 条边,使得剩下的图是一个可环覆盖图的方案数。可环覆盖的定义是,可以将边集划分成若干个子集,使得每个子集都形成一个环。n25

wzr 表示这就是 fwt 模板题。需要重点记录一下了。
显然地,连接 (u,v) 的边的权值为 s=2u+2v,问题就是求 i 大小的集合异或起来为 0 的方案数。
这是一个背包的形式,考虑写成生成函数,那么相当于求 [x0](1+xsy)
其中 x 这一维做异或卷积,y 这维是加法卷积。
考虑对 x 这维做 fwt,因为只有一个位置要做,所以做出来一定是 1+y 或者 1y
套路地把全部的 s 一起 fwt,那么每个位置的 fwt 值是 (1+y) 的个数减 (1y) 个数,可以解出来。
那么 fwt 每个位置乘起来就是诸如 (1+y)k(1y)mk
而我们要求的是 ifwt 回去 0 号位置的值,注意到该值就是 2nfwti
所以只需要知道每个 k 的个数即可,后面可以在 poly(m) 时间求出每个答案。

posted @   s1monG  阅读(75)  评论(10编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示