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];
()里为或,且,异或中的一种。\(n\le 2^{19}\)。
考虑线段树维护。注意到如果为或/且,那么相当于对于某些层的节点左右儿子进行线段树合并。
对于异或操作,相当于交换左右儿子。
那么维护三个 tag 即可。因为每个点只会被并一次所以复杂度是对的。
C
\(n\) 个鱼缸,第 \(i\) 个鱼缸的水高 \(h_i\),鱼缸高 \(w\),有 \(m\) 条鱼,初始在某个位置,跳跃能力为 \(J\)。
从 \(i\) 能跳到相邻的鱼缸的条件是 \(w-h_i\le J\)。鱼任意跳,问到在一个鱼缸的鱼的对数最多是多少。
\(n\le 1e4,m\le 200\)。
考虑求出每个鱼能活动的区间,然后离散化后区间 dp。
每次选一个点并把跨越这个点的鱼都聚集在该点,并划分子任务为左右两个区间。
D
给定一张 \(n\) 个点,\(m\) 条边的简单无向图,对每个 \(i∈[0,m]\),计算它只保留 \(i\) 条边,使得剩下的图是一个可环覆盖图的方案数。可环覆盖的定义是,可以将边集划分成若干个子集,使得每个子集都形成一个环。\(n\le 25\)。
显然地,连接 \((u,v)\) 的边的权值为 \(s=2^u+2^v\),问题就是求 \(i\) 大小的集合异或起来为 \(0\) 的方案数。
这是一个背包的形式,考虑写成生成函数,那么相当于求 \([x^0]\prod (1+x^sy)\)。
其中 \(x\) 这一维做异或卷积,\(y\) 这维是加法卷积。
考虑对 \(x\) 这维做 fwt,因为只有一个位置要做,所以做出来一定是 \(1+y\) 或者 \(1-y\)。
套路地把全部的 \(s\) 一起 fwt,那么每个位置的 fwt 值是 \((1+y)\) 的个数减 \((1-y)\) 个数,可以解出来。
那么 fwt 每个位置乘起来就是诸如 \((1+y)^{k}(1-y)^{m-k}\)。
而我们要求的是 ifwt 回去 \(0\) 号位置的值,注意到该值就是 \(2^{-n}\sum fwt_i\)。
所以只需要知道每个 \(k\) 的个数即可,后面可以在 \(poly(m)\) 时间求出每个答案。