T1

100%

假设第 ii 名同学装弱,那么他的真实分数应为 bi+10b_i+10,其他同学的真实分数仍为报出的分数。

要使真实分数仍按排名非严格递减,需要满足:

  • bi+10106b_i+10\le 10^6,即真实分数没有超过满分;
  • i>1i>1,则 bi1bi+10b_{i-1}\ge b_i+10,即他的真实分数没有超过前一名。

不需要检查后一名,因为输入已经保证 bibi+1b_i\ge b_{i+1},增加 1010 后仍然满足 bi+10bi+1b_i+10\ge b_{i+1}

枚举每个位置并检查上述条件,统计合法位置数即可。时间复杂度为 O(n)O(n)

T2

50%

枚举每个位置作为一段连胜的起点,再向右找到第一个 L,可以求出从该位置开始的连续 W 数量。

时间复杂度为 O(n2)O(n^2)

100%

从左到右扫描字符串,维护当前连续出现的 W 数量 now 和历史最大值 ans

  • 遇到 W 时令 now11,并用它更新 ans
  • 遇到 L 时令 now=0

每个字符只处理一次。时间复杂度为 O(n)O(n)

T3

100%

按从小到大的顺序枚举 nn 的每个因数 kk。对于固定的 kk,将序列依次划分为 n/kn/k 个长度为 kk 的连续段,并统计每段中支持款式 11 的人数 cntcnt

该组中支持款式 22 的人数为 kcntk-cnt,所以当且仅当

cnt>kcntcnt>k-cnt

时,这一组支持款式 11。逐组判断并统计即可得到当前 kk 的答案。

因为只枚举 nn 的因数,每种分组都能恰好覆盖所有同学;又因为不同小组对应互不相交的连续段,所以每个小组都会被恰好统计一次。

d(n)d(n)nn 的因数个数。对于每个因数都扫描一次整个序列,时间复杂度为 O(nd(n))O(nd(n))

T4

30%

每个操作都有选择和不选择两种可能,可以用 DFS 枚举所有选择方案,并在递归过程中维护当前的 xx

时间复杂度为 O(2n)O(2^n),递归空间复杂度为 O(n)O(n)

100%

LiL_iRiR_i 分别表示只考虑前 ii 个操作时,能够得到的最小值和最大值。

初始时还没有处理任何操作,只能得到 x=0x=0,因此

L0=R0=0.L_0=R_0=0.

若不选择第 ii 个操作,原来的结果仍然可达;若选择它,变换为

x2aix.x\longmapsto 2a_i-x.

对于第 ii 个操作,有“不选择”和“选择”两种决策。不选择时,原来的两个极值保持不变;选择时,由于 2aix2a_i-x 关于 xx 单调递减,新的最小值由原最大值产生,新的最大值由原最小值产生。因此

$$\begin{aligned} L_i&=\min\bigl(L_{i-1},\ 2a_i-R_{i-1}\bigr),\\ R_i&=\max\bigl(R_{i-1},\ 2a_i-L_{i-1}\bigr). \end{aligned}$$

每一步都考虑了是否使用当前操作,因此所有合法的操作子序列都被包含在状态中;而一次跳跃是单调递减的线性变换,其变换后结果的极值只可能由变换前的两个极值产生,所以无需保存其他可达值。最终答案为 RnR_n

时间复杂度为 O(n)O(n)

T5

50%

固定一次询问的线路宽度 ww。对于每个节点 uu,从 uu 不断向父亲移动,同时维护路径上的最小、最大权值,就能找到满足路径宽度不超过 ww 的最浅祖先 highuhigh_u

求出所有 highuhigh_u 后,再自底向上贪心。直接逐级向上寻找的单次询问复杂度为 O(n2)O(n^2)

100%

先把树以 11 为根,求出每个节点的父亲、深度以及一份父亲先于儿子的遍历序。以下是单次询问的做法。

对于节点 uu,记 highuhigh_u 为满足

$$\max_{v\in path(high_u,u)}a_v- \min_{v\in path(high_u,u)}a_v\le w$$

的最浅祖先。从 uu 向上加入更多节点时,路径最大值不会减小,最小值不会增大,因此路径宽度单调不降。

预处理倍增数组:

  • upu,jup_{u,j} 表示 uu2j2^j 级祖先;
  • mnu,j,mxu,jmn_{u,j},mx_{u,j} 分别表示从 uuupu,jup_{u,j} 的路径上的最小、最大权值。

对于一次询问,从节点 uu 开始维护当前路径的最小值和最大值,按 jj 从大到小尝试向上跳 2j2^j 步。若合并这一段后仍满足最大值减最小值不超过 ww,就接受这次跳跃。最终停留的位置就是 highuhigh_u

每个节点的 highuhigh_u 可以在 O(logn)O(\log n) 时间内求出。

每条线路的下端点确定后,都把它的上端点放在能够到达的最浅祖先处,这不会减少它覆盖的节点。

逆序处理节点。令 toputop_u 表示当前已经选择且下端点位于 uu 子树内的所有线路中,上端点的最小深度;若还没有这样的线路,则令 topu=+top_u=+\infty

先合并所有儿子:

topu=minv 是 u 的儿子topv.top_u=\min_{v\text{ 是 }u\text{ 的儿子}}top_v.
  • topudepthutop_u\le depth_u,对应线路的下端点在 uu 的子树中、上端点是 uuuu 的祖先,所以这条线路已经覆盖 uu

  • topu>depthutop_u>depth_u,当前没有任何已选线路覆盖 uu。新建线路 highuuhigh_u\to u,答案加 11,并令

    topu=min(topu,depthhighu).top_u=\min(top_u,depth_{high_u}).

这个贪心是最优的。处理到未覆盖的 uu 时,任何完整方案都必须再加入至少一条覆盖 uu 的线路。若这条线路的下端点是 uu 的严格后代,把它替换成 highuuhigh_u\to u 不会破坏已经完成的子树覆盖;同时,原线路从某个祖先到 uu 的前缀也是合法的,所以 highuhigh_u 不会比原线路的上端点更深。也就是说,在同样新增一条线路的前提下,选择下端点 uu 对后续祖先的覆盖不会更差。

倍增预处理的时间和空间复杂度均为 O(nlogn)O(n\log n)。每次询问求所有 highuhigh_u 需要 O(nlogn)O(n\log n),贪心需要 O(n)O(n),所以总时间复杂度为 O(nlogn+qnlogn),O(n\log n+qn\log n),

T6

20%

n15n\le15 时可以直接按照定义拼接出 S3,S4,,SnS_3,S_4,\ldots,S_n,再遍历 SnS_n 统计答案。

60%

CiC_i 表示 SiS_iwow 的出现次数。由

Si=Si2+Si1S_i=S_{i-2}+S_{i-1}

可知 SiS_i 中的 wow 分为三类:完全位于 Si2S_{i-2} 中、完全位于 Si1S_{i-1} 中、跨越两个字符串的拼接位置。记第三类的数量为 EiE_i,则

Ci=Ci2+Ci1+Ei.C_i=C_{i-2}+C_{i-1}+E_i.

由于 wow 的长度为 33,跨界出现只可能有以下两种形式:

  • 左侧字符串的最后一个字符与右侧字符串的前两个字符组成 wow
  • 左侧字符串的最后两个字符与右侧字符串的第一个字符组成 wow

因此只需保存每个字符串长度为 22 的前缀和后缀,就能在 O(1)O(1) 时间内求出 EiE_i,再按照递推式计算 CiC_i。这一做法的时间复杂度为 O(n)O(n)

100%

由于 S1,S2S_1,S_2 均非空,所以 S32|S_3|\ge2。对于 i4i\ge4SiS_i 的末尾来自 Si1S_{i-1},且 Si12|S_{i-1}|\ge2,因此

sufi=sufi1.suf_i=suf_{i-1}.

也就是说,从 S3S_3 开始,所有字符串长度为 22 的后缀都相同。类似地,对于 i5i\ge5SiS_i 的开头完整来自 Si2S_{i-2},因此

prei=prei2.pre_i=pre_{i-2}.

所以长度为 22 的前缀按照下标奇偶交替。跨界贡献 EiE_i 只由 Si2S_{i-2} 的后缀和 Si1S_{i-1} 的前缀决定,故从 i=5i=5 开始也只会在两个常数之间交替。记

$$E_i= \begin{cases} p,&i\text{ 为奇数},\\ q,&i\text{ 为偶数}, \end{cases} \qquad(i\ge5).$$

只需构造长度很小的 S3,S4S_3,S_4,便可直接求出 C3,C4C_3,C_4。其中 pp 是拼接 S3+S4S_3+S_4 时的跨界贡献;qq 是下一次拼接的跨界贡献。计算 qq 时不必构造完整的 S5S_5,因为 S5S_5 的前两个字符与 S3S_3 相同。

为处理递推中的加法常数,定义

$$V_i= \begin{pmatrix} C_{i-1}\\ C_i\\ 1 \end{pmatrix}.$$

若下一次拼接的跨界贡献为 cc,则

$$V_{i+1}= M(c)V_i, \qquad M(c)= \begin{pmatrix} 0&1&0\\ 1&1&c\\ 0&0&1 \end{pmatrix}.$$

A=M(p),B=M(q).A=M(p),\qquad B=M(q).

V4=(C3,C4,1)TV_4=(C_3,C_4,1)^T 出发,第一次转移到 V5V_5 使用 AA,第二次转移到 V6V_6 使用 BB,之后不断交替。因此可以把相邻两次转移合并为 BABA

t=n4t=n-4。若 tt 为偶数,则

Vn=(BA)t/2V4;V_n=(BA)^{t/2}V_4;

tt 为奇数,则

Vn=A(BA)t/2V4.V_n=A(BA)^{\lfloor t/2\rfloor}V_4.

VnV_n 的第二项就是 CnC_n。当 n4n\le4 时直接构造字符串并统计即可。

矩阵大小固定为 3×33\times3,每组数据的时间复杂度为 O(logn)O(\log n)

0 comments

No comments so far...