T1 大新闻
- 题目大意
- 定义 f(x)=max{x xor i} i∈[0,n−1]
-
ans=n∗p∗∑i=0n−1f(i)+(1−p)∗∑i=0n−1∑j=0n−1i xor jn2=pn∗∑i=0n−1i∗f(i)+1−pn2∗∑i=0n−1∑j=0n−1i xor j
- 题解
- 这是两个子问题,求 ∑i∗f(i)和∑∑i xor j
- 第二个问题,我们只要求出对于 [1,n−1] 二进制下的第i位有sum[i]个数是 1,tot=∑sum[i]∗(n−sum[i])∗2i−1
- 这个其实很好求,我们找一下规律,对于第
i
位,它为0和为1的区间是连续的,且每段长度都为
2i−1 ,那么显然 [1,n−1] 内 sum[i]=⌊n2i⌋∗2i−1+max{n−⌊n2i⌋∗2i−2i−1,0} - 第一个问题,我们数位DP来求,即求出第
i
位有多少个数的结果是
1 - 对于前
i−1
位都与
n−1
相同的第
i
位
- 若
n−1的第i位 为0,那么这一位的答案一定为0,
- 若
T2 谈笑风生
- 题目大意
- 给定一棵有根树
-
定义一个三元组(a,b,c),满足
- a,b,c互不相等
- c在a和b的子树内
- a和b的距离不超过k
- 每次询问时给定 a,k ,询问三元组 (a,b,c) 的数量
- 题解
- 若b不在a的子树内,对答案的贡献为min{k,dep[a]−1}
- 若b在a的子树内,就是询问a的子树内与a的深度差不超过k的点的size[i]−1的和
- 我们发现深度差不超过k,其实是满足这个前缀和相减的性质的
- 也就是说我们只是要支持询问子树内深度差为k的size[i]−1和即可
- 子树转成DFS序即可
- 深度差既然是前缀和相减得到的,我们联想一下已知的数据结构........主席树!!!
- 按照DFS序构建主席树,主席树中区间存深度在该区间范围内的size[i]−1的和
- CODE
T3 图样图森破
- 题目大意
- 题解