第十六次
A
考虑 $\bigoplus\limits_{i=1}^n a_i=0$,那随便分开两段即可。
否则设 $\bigoplus\limits_{i=1}^n a_i=x$,若能找到 $l<r$ 使得 $\bigoplus\limits_{i=1}^l a_i=x$,$\bigoplus\limits_{i=1}^r a_i=0$,则可以分成 $[1,l],[l+1,r],[r+1,n]$ 三段。
B
分治,每次考虑跨越分治中点 $m$ 的贡献。
分治,设当前区间为 $[l,r]$,考虑跨过分治中点 $m=\lfloor\dfrac{l+r}2\rfloor$ 的满足条件的区间个数。
枚举区间左端点 $i\in[l,m]$,设右端点为 $j$,则对每个 $i$,总有 $p$ 满足:
- $\forall j\in(m,p]$,$[i,j]$ 的 $\max$ 落在 $[i,m]$ 中,
问题转化为求有多少 $j\in(m,p]$ 满足 $k|\sum\limits_{x=m+1}^j a_x+\sum\limits_{x=i}^m a_x+\max\limits_{x=i}^m a_x$,
而 $\sum\limits_{x=i}^m a_x+\max\limits_{x=i}^m a_x$ 已知,对 $j\in(m,p]$ 维护 $\sum\limits_{x=m+1}^j a_x$ 的桶即可,
- $\forall j\in(p,r]$,$[i,j]$ 的 $\max$ 落在 $(m,j]$ 中,
问题转化为求有多少 $j\in(p,r]$ 满足 $k|\sum\limits_{x=m+1}^j a_x+\max\limits_{x=m+1}^j a_x+\sum\limits_{x=i}^m a_x$,
而 $\sum\limits_{x=i}^m a_x$ 已知,对 $j\in(p,r]$ 维护 $\sum\limits_{x=m+1}^j a_x+\max\limits_{x=m+1}^j a_x$ 的桶即可。
然后倒序枚举 $i$,发现 $p$ 单调后移,双指针即可。
C
数位 DP,设 $f_{x,S}$ 表示填到第 $x$ 位,填了 $S$ 中的数的方案数,求第 $k$ 小直接二分。
scanf("%llx", &x)
可以输入 16 进制无符号长整型。