【Codeforces 1336】简要题解

A

显然按照 d e p − s i z dep-siz depsiz排序后贪心
代码就不放了

B

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

C

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

code

D

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

考虑这样询问 n − 1....4 , 3 , 1 , 2 , 1 n-1....4,3,1,2,1 n1....4,3,1,2,1
由于一插入了两次,所以可以确定 1 1 1的个数
然后考虑插入两次 1 1 1顺子的变化
分别是 ( a 3 + 1 ) ∗ a 2 和 ( a 3 + 1 ) ∗ ( a 2 + 1 ) (a_3+1)*a_2和(a_3+1)*(a_2+1) (a3+1)a2(a3+1)(a2+1)
相减可以得到 a 3 a_3 a3,然后得到 a 2 a_2 a2
然后利用插入 i − 2 i-2 i2时顺子变化量就可以得到 a i a_i ai
这样就不用插入 a n a_n an

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

code

E1

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

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

code

E2

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

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

现在考虑 f ^ \hat{f} f^ p o p c o u n t popcount popcount每一个的值

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

那么可以得到 f ^ i 为 2 k \hat{f}_i为2^k f^i2k当且仅当和 S S S所有数的交的 p o p c o u n t popcount popcount都为偶数
证明考虑如果有一个交为奇数,那么系数为负,显然权值和不可能得到 2 k 2^k 2k

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

所以需要的只是和所有基的交 p o p c o u n t popcount popcount为偶数

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

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

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

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

code

F

考虑按照 l c a lca lca是否相同讨论

首先是不同的情况
在这里插入图片描述
对于路径 ( E , F ) , ( G , H ) (E,F),(G,H) (E,F),(G,H)
考虑 B B B时,将两条路径往下 k k k步的点 C , D C,D C,D子树加
然后在 A A A时询问两个端点 E , F E,F E,F的值即可

树状数组维护即可

对于相同的再分两种情况
首先是路径的并没有完全的包含住 L c a Lca Lca,即 l c a lca lca在路径并的端点上在这里插入图片描述
对于路径 ( A , E ) , ( C , D ) (A,E),(C,D) (A,E),(C,D)
只需要类似的在 l c a lca lca往下 k k k步的子树加单点求和即可
但是注意为了不算重可以按照 d f s dfs dfs顺序只加一个询问另一个

在这里插入图片描述

剩下是整个包含 l c a lca lca的情况 ( B , E ) , ( C , F ) (B,E),(C,F) (B,E),(C,F)
对于路径 ( u , v ) (u,v) (u,v)
对每个点 u u u维护一个线段树,维护 d f s dfs dfs上所有 v v v

然后考虑往上合并,
在两个 u 1 , u 2 u_1,u_2 u1,u2 l c a ′ lca' lca处,
找到往 L c a Lca Lca再往 v 1 v_1 v1 k k k步的位置,询问子树中有多少个 v v v
即对于所有合法 v 2 v_2 v2

合并的过程可以用启发式合并+线段树合并
可以对于所有的 u u u建出一颗虚树再 d f s dfs dfs

或者考虑重剖,求 d f s dfs dfs序的时候先走轻儿子再走重儿子
然后对于每个路径满足 i n [ u ] < i n [ v ] in[u]<in[v] in[u]<in[v]
这样一定不会有 u u u在当前 l c a lca lca的重儿子内

所以只用 d f s dfs dfs自己轻儿子的整个子树
考虑复杂度一个点只会对所有轻边的父亲贡献
所以 d f s dfs dfs所有点的复杂度是 O ( n l o g n ) O(nlogn) O(nlogn)

复杂度 O ( m l o g 2 n ) O(mlog^2n) O(mlog2n)

code

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值