A

显然按照depsizdep-siz排序后贪心
代码就不放了

B

显然枚举一个另外两个是最近的
代码就不放了

C

f[i][j]f[i][j]表示已经和TT匹配了ii个,用了SSj,j+i1j,j+i-1的方案数
显然每次要么SS往左或右拓展一位

code

D

考虑如果某个数不是00个,那么插入一个后一定可以通过碰的个数确定这个数有几个
如果插入一个ii
顺子的变化量是a[i+2]a[i+1]+a[i+1]a[i1]+a[i1]a[i2]a[i+2]*a[i+1]+a[i+1]*a[i-1]+a[i-1]*a[i-2]

考虑这样询问n1....4,3,1,2,1n-1....4,3,1,2,1
由于一插入了两次,所以可以确定11的个数
然后考虑插入两次11顺子的变化
分别是(a3+1)a2(a3+1)(a2+1)(a_3+1)*a_2和(a_3+1)*(a_2+1)
相减可以得到a3a_3,然后得到a2a_2
然后利用插入i2i-2时顺子变化量就可以得到aia_i
这样就不用插入ana_n

主要就是利用边界来优化获得信息

code

E1

考虑建出线性基
如果大小为kk
显然剩下nkn-k个数怎么选都对应线性基的一种选法得到某个特定的数
所以最后方案乘一个2nk2^{n-k}

然后考虑线性基内组成的数
对于前后m/2m/2的所有基分别爆搜出所有可以组成的数
于是两边的某i,ji,j组合的位数就是i17+(i17j)i前17位的位数+(i后17位\oplus j的位数)
枚举高位的位数,然后fwtfwt优化即可

code

E2

考虑设线性基中所有可以组成的数的集合为SS
fi=[iS]gc,i=[popcount(i)=c]f_i=[i\in S],g_{c,i}=[popcount(i)=c]
那么有cc位的答案就是(fgc)[0]2nk(f*g_c)[0]*2^{n-k}*为异或卷积
(fgc)[0](f*g_c)[0]就是f,gcf,g_{c}转点值之后对应位乘起来的和
考虑分别优化
先考虑gcg_c,显然对于popcountpopcount相同的ii,fwtfwt之后的值相同
考虑fwtfwt意义,g^c,i=j,popcount(j)=c(1)j&i\hat{g}_{c,i}=\sum_{j,popcount(j)=c}(-1)^{|j\&i|}
那么g^c,x(popcount(x)=i)=j=0m(ij)(micj)(1)j\hat{g}_{c,x}(popcount(x)=i)=\sum_{j=0}^m{i\choose j}{m-i\choose c-j}(-1)^j

于是所有可以在O(m3)O(m^3)内求出

现在考虑f^\hat{f}popcountpopcount每一个的值

首先根据线性基的封闭性显然有
ff=f2kf^f^=f^2kf*f=f*2^k,\hat{f}*\hat{f}=\hat{f}*2^k
所以f^\hat{f}每一位要么为0,0,要么为2k2^k

那么可以得到f^i2k\hat{f}_i为2^k当且仅当和SS所有数的交的popcountpopcount都为偶数
证明考虑如果有一个交为奇数,那么系数为负,显然权值和不可能得到2k2^k

再考虑若i&x,j&x|i\&x|,|j\&x|为偶数,那么有(ij)&x|(i\oplus j)\&x|为偶数

所以需要的只是和所有基的交popcountpopcount为偶数

考虑线性基的矩阵形式
将主元所在的kk列提到前面取,显然前面kkk*k是一个单位矩阵
后面k(mk)k*(m-k)是乱的

而考虑如果对于后面(mk)(m-k)列的位任意为0/10/1,那么和每一个基这mkm-k位的交位数决定了这个基对应前面的那位是00还是11

所以可以得到f^\hat{f}中有值的个数只有2mk2^{m-k}
爆搜出来即可
这样就可以做到2m22^{\frac m 2}
对于kk小的情况直接爆搜线性基即可得到答案

这样复杂度是O(n+m3+2m2)O(n+m^3+2^{\frac m 2})

code

F

考虑按照lcalca是否相同讨论

首先是不同的情况
【Codeforces 1336】简要题解
对于路径(E,F),(G,H)(E,F),(G,H)
考虑BB时,将两条路径往下kk步的点C,DC,D子树加
然后在AA时询问两个端点E,FE,F的值即可

树状数组维护即可

对于相同的再分两种情况
首先是路径的并没有完全的包含住LcaLca,即lcalca在路径并的端点上【Codeforces 1336】简要题解
对于路径(A,E),(C,D)(A,E),(C,D)
只需要类似的在lcalca往下kk步的子树加单点求和即可
但是注意为了不算重可以按照dfsdfs顺序只加一个询问另一个

【Codeforces 1336】简要题解

剩下是整个包含lcalca的情况(B,E),(C,F)(B,E),(C,F)
对于路径(u,v)(u,v)
对每个点uu维护一个线段树,维护dfsdfs上所有vv

然后考虑往上合并,
在两个u1,u2u_1,u_2lcalca'处,
找到往LcaLca再往v1v_1kk步的位置,询问子树中有多少个vv
即对于所有合法v2v_2

合并的过程可以用启发式合并+线段树合并
可以对于所有的uu建出一颗虚树再dfsdfs

或者考虑重剖,求dfsdfs序的时候先走轻儿子再走重儿子
然后对于每个路径满足in[u]<in[v]in[u]<in[v]
这样一定不会有uu在当前lcalca的重儿子内

所以只用dfsdfs自己轻儿子的整个子树
考虑复杂度一个点只会对所有轻边的父亲贡献
所以dfsdfs所有点的复杂度是O(nlogn)O(nlogn)

复杂度O(mlog2n)O(mlog^2n)

code

相关文章:

  • 2021-10-17
  • 2021-09-09
  • 2022-12-23
  • 2021-11-02
  • 2021-08-19
  • 2021-06-22
  • 2021-09-13
  • 2021-12-18
猜你喜欢
  • 2021-12-31
  • 2021-08-28
  • 2021-08-15
  • 2021-10-10
  • 2022-12-23
  • 2022-01-21
  • 2022-02-01
相关资源
相似解决方案