显然按照dep−siz排序后贪心
代码就不放了
显然枚举一个另外两个是最近的
代码就不放了
设f[i][j]表示已经和T匹配了i个,用了S中j,j+i−1的方案数
显然每次要么S往左或右拓展一位
code
考虑如果某个数不是0个,那么插入一个后一定可以通过碰的个数确定这个数有几个
如果插入一个i后
顺子的变化量是a[i+2]∗a[i+1]+a[i+1]∗a[i−1]+a[i−1]∗a[i−2]
考虑这样询问n−1....4,3,1,2,1
由于一插入了两次,所以可以确定1的个数
然后考虑插入两次1顺子的变化
分别是(a3+1)∗a2和(a3+1)∗(a2+1)
相减可以得到a3,然后得到a2
然后利用插入i−2时顺子变化量就可以得到ai
这样就不用插入an了
主要就是利用边界来优化获得信息
code
考虑建出线性基
如果大小为k
显然剩下n−k个数怎么选都对应线性基的一种选法得到某个特定的数
所以最后方案乘一个2n−k
然后考虑线性基内组成的数
对于前后m/2的所有基分别爆搜出所有可以组成的数
于是两边的某i,j组合的位数就是i前17位的位数+(i后17位⊕j的位数)
枚举高位的位数,然后fwt优化即可
code
考虑设线性基中所有可以组成的数的集合为S
设fi=[i∈S],gc,i=[popcount(i)=c]
那么有c位的答案就是(f∗gc)[0]∗2n−k,∗为异或卷积
(f∗gc)[0]就是f,gc转点值之后对应位乘起来的和
考虑分别优化
先考虑gc,显然对于popcount相同的i,fwt之后的值相同
考虑fwt意义,g^c,i=∑j,popcount(j)=c(−1)∣j&i∣
那么g^c,x(popcount(x)=i)=∑j=0m(ji)(c−jm−i)(−1)j
于是所有可以在O(m3)内求出
现在考虑f^中popcount每一个的值
首先根据线性基的封闭性显然有
f∗f=f∗2k,f^∗f^=f^∗2k
所以f^每一位要么为0,要么为2k
那么可以得到f^i为2k当且仅当和S所有数的交的popcount都为偶数
证明考虑如果有一个交为奇数,那么系数为负,显然权值和不可能得到2k
再考虑若∣i&x∣,∣j&x∣为偶数,那么有∣(i⊕j)&x∣为偶数
所以需要的只是和所有基的交popcount为偶数
考虑线性基的矩阵形式
将主元所在的k列提到前面取,显然前面k∗k是一个单位矩阵
后面k∗(m−k)是乱的
而考虑如果对于后面(m−k)列的位任意为0/1,那么和每一个基这m−k位的交位数决定了这个基对应前面的那位是0还是1
所以可以得到f^中有值的个数只有2m−k个
爆搜出来即可
这样就可以做到22m了
对于k小的情况直接爆搜线性基即可得到答案
这样复杂度是O(n+m3+22m)的
code
考虑按照lca是否相同讨论
首先是不同的情况

对于路径(E,F),(G,H)
考虑B时,将两条路径往下k步的点C,D子树加
然后在A时询问两个端点E,F的值即可
树状数组维护即可
对于相同的再分两种情况
首先是路径的并没有完全的包含住Lca,即lca在路径并的端点上
对于路径(A,E),(C,D)
只需要类似的在lca往下k步的子树加单点求和即可
但是注意为了不算重可以按照dfs顺序只加一个询问另一个

剩下是整个包含lca的情况(B,E),(C,F)
对于路径(u,v)
对每个点u维护一个线段树,维护dfs上所有v
然后考虑往上合并,
在两个u1,u2的lca′处,
找到往Lca再往v1走k步的位置,询问子树中有多少个v
即对于所有合法v2
合并的过程可以用启发式合并+线段树合并
可以对于所有的u建出一颗虚树再dfs
或者考虑重剖,求dfs序的时候先走轻儿子再走重儿子
然后对于每个路径满足in[u]<in[v]
这样一定不会有u在当前lca的重儿子内
所以只用dfs自己轻儿子的整个子树
考虑复杂度一个点只会对所有轻边的父亲贡献
所以dfs所有点的复杂度是O(nlogn)的
复杂度O(mlog2n)
code