第十六次

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 进制无符号长整型。

posted @ 2023-08-09 17:40  5k_sync_closer  阅读(2)  评论(0编辑  收藏  举报  来源