QBXT 2023 NOIp 集训 做题记录

Day 1 上午

A. kimi

显然只会去换两国货币面值最小的那一种货币,直接枚举某国的换多少即可.

* B. no

一眼的贪心假了./ll

第一问直接选择当前能到的点中编号最小的那一个即可.

第二问不能贪心选最大的访问,因为当前可以访问的节点中可能有些可以访问且不会造成代价的节点,先访问这些节点可能可以解锁一些编号更大的点.于是先将可以走完的点走完再取最大的即可.

* C. shiranai

原题是 gym101821B

注意到选出的 LIS 和 LDS 中一定存在一个位置,使得在这一位置之前,LDS 的所有元素大于 LIS 的所有元素,在这位置之后,LDS 的所有元素都小于 LIS 的元素.我们称这一位置为“交点”.

考虑枚举 LIS 中交点前的一个位置 ii,并钦定 LDS 中交点前的一个元素在 ii 之前,容易发现在 ii 之后的情况可以通过把序列倒过来再做一遍规避掉.

考虑可以选择哪些位置的两个点拼接起来.如下图:

爱来自 mspaint

其中红点是在 LIS 中相邻的两个元素,我们需要在 A 或 B 区间中选择某个元素,然后再从 C 中选择一个元素,使得以第一个选择的元素结尾的 LDS 拼上以第二个选择的元素为开头的 LDS 长度等于全局 LDS.若能选出来,显然能给出一组合法构造.

如何选?先考虑 A,C 两区域内选元素的方案,这显然在两部分中贪心选最长的即可,因为有 i+1i + 1 的值的限定,无论如何选都是合法的.

B,C 区域选元素的方案貌似不好统计,但是我们可以维护一个处于 LDS 中的元素,他可选的后继元素最远在哪.若 B 区域中的元素后继最远距离超过 ii,选择这两个就是一个合法方案.

代码非常 /tuu.

* D. monogatari

显然由于权值互不相同,好路径的条数不超过 nn 个.

考虑一个过程,从 00 开始枚举 LL,每次将权值 =L= L 的点加入到图中,若枚举到 xx 时连通块个数为 11 且是一条链,那么长度为 xx 的好路径存在.

先考虑路径祖先到儿子的情况,我们只需维护加入权值 i\le i 时,所有连通块的叶子数,查询就是查询全局 11 的个数.由于修改是交换两个点的权值,所以只需要重算会改动的 O(1)O(1) 个点的贡献即可.又由于叶子数不会小于 11,所以直接使用线段树维护区间最小值和最小值出现次数即可.

再考虑路径是 uu 向上到 wwww 再向下到 vv 的情况,其中 wwuuvv 的 LCA.考虑在 ww 处统计这种路径的贡献.发现若一个点能够计入贡献,当且仅当它是在枚举过程中第一个具有两个儿子的点,且它的父亲没有被选,它可能贡献到的 LL 是一段区间,这个区间可以使用 std::set 维护,我们只需要找到这个区间内合法的位置有多少个,即对等于 22 的位置计数.由于区间内的位置,值至少为 22,所以直接查询区间最小值及其出现次数即可.

Day 1 下午

A. 芙莉莲

首先每位独立,然后只需计算出有几位可以填两种值,分讨即可.

B. 新娘

首先可以通过一些交换,将所有情况转化为 xu<xvx_u < x_vyu<yvy_u < y_v 的情况.

由于查询矩形被 uuvv 对应的点构成的矩形包含,所以 Manhattan 距离的绝对值可以直接去掉.将第三问的式子写出来:

xxu+yyu<xvx+yvy    y<x+xu+yu+xv+yv2x - x_u + y - y_u < x_v - x + y_v - y \iff y < -x + \frac{x_u + y_u + x_v + y_v}{2}

发现答案形如矩形内在某条直线下方的整点数.事实上我们只需算出 xx 坐标在某一区间内,在某条斜率为 1-1 的直线下方,在某条斜率为 00 的直线上方的整点数目,其他答案都可以通过差分得到.这个问题可以分讨第二条线关于第一条线和界的交点的位置关系,然后就是一个等差数列求和.

* C. 虚假的圣所

拜谢 ckain.

不妨令全局权值和为 ssuu 子树的权值和为 sumu\mathrm{sum}_u

先考虑没有选择点集限制的时候怎么做.由于选择 uu 时的答案形式为 max{maxvsumv,ssumu}\max\{\max_v \mathrm{sum}_v, s - \mathrm{sum}_u\},由于需要单点修改点权,所以两部分不能直接维护.考虑 max\max 会如何决策,发现若我们找到深度最深的一个 sumus2\mathrm{sum}_u \ge \frac{s}{2} 的点,在这个点的祖先链上的所有点都取的第一部分,其他点取的都是第二部分.由于取第二部分的点构成一条 dfn 序单调递增的链,故我们可以直接在 dfn 序上二分,取最后一个满足这个条件的点即可.

现在考虑如何查询,对于链上的点,显然选最深的那一个点的最大子树,轻重链剖分后维护区间 sumu\mathrm{sum}_u 的最大值即可统计.不在链上的点都取的 ssumus - \mathrm{sum}_u,且轻重链剖分后这些点的 dfn 也处在 O(logn)O(\log n) 个区间中,贪心选最大的 sumu\mathrm{sum}_u 即可.

考虑带上点集限制怎么做.对于不在链上的点,直接将不能选的位置赋值成 -\infty 即可,但是链上的点的决策需要一点讨论,我们需要找到最深的一个可以选的点,取它的最大子树即可.

时间复杂度 O(nlog2n)O(n \log^2 n)

! D. 乘兴

太困难!!!

Day 2

A. 我现在肺痒痒

暴力即可.

B. 烟 distance

首先,(gcd,len)(\gcd, \mathrm{len}) 的二元组只有 O(d(n))O(d(n)) 个,可以枚举.现在考虑钦定了 gcd\gcd 和长度的方案该如何计算.

有一个 naive 的想法是,我们统计包含 ii 作为因数的元素个数 cti\mathrm{ct}_i,二元组 (i,len)(i, \mathrm{len}) 的方案数就是 (ctilen)\binom{\mathrm{ct}_{i}}{\mathrm{len}}.这显然是错的,因为有些 gcd\gcdii 的倍数的子序列也将会被统计.若设 fif_i 表示 gcd=i\gcd = i 时的子序列数,有

(ctilen)=idfd\binom{\mathrm{ct}_{i}}{\mathrm{len}} = \sum_{i | d} f_d

这不是我们 Mobius 反演的题目吗!直接反演得到

fi=idμ(d/i)(ctdlen)f_i = \sum_{i | d} \mu(d / i) \binom{\mathrm{ct}_{d}}{\mathrm{len}}

然后就可以 O(n+nlogn)O(\sqrt{n} + n \log n) 计算了.

* C. I got smoke

由于 ii 步能造出的状态是指数级的,猜测这几个运算的循环节都是 O(V)O(V) 的,故答案不会超过 O(logV)O(\log V)

此时直接搜索的复杂度是 O(V)O(V) 的,爆炸了.考虑一个双向搜索,复杂度就是 O(V)O(\sqrt{V}) 了.

3131 次幂的逆运算,由于模 998244352998244352 意义下 3131 存在逆元,直接求出逆元后算 31131^{-1} 次幂即可.

! D. Zood

太困难!!!

Day 3 上午

A. 交易资金

考虑第一次询问什么.假如第一次询问 ii,那么对于初始预算 i\ge i 的情况,都可以直接拿到钱,剩下的需要继续猜,其中预算 k\le k 的情况已经废了,剩下的是一模一样的子问题.于是我们可以设计 DP,设 fif_i 表示预算在 [1,i][1, i] 的所有情况,最终得到钱数和的最大值,有转移:

fi=maxji{fj1k+j(ij+1)}f_i = \max_{j \le i} \{f_{j - 1 - k} + j(i - j + 1)\}

这个时候已经可以斜率优化了,但是我打表发现决策点单调增,直接双指针就能过去.

* B. 异或

先给树随便定个根.

考虑将 uu 的每个子节点子树的异或值钦定为 0Cu10 \sim |C_u| - 1,其中 CuC_u 表示 uu 的儿子集合.

这样就只剩下去掉 uu 子树部分的异或值需要考虑,我们钦定根节点的权值包含 n2n - 2 的最高位,这样就不会产生冲突.

C. 机房惨案

fS,Tf_{S, T} 表示已到达 SS 中的点,此时 TT 中的点 dis\mathrm{dis} 正确的方案数,枚举新走哪个点,容易转移,复杂度 O(n4n)O(n4^n)

显然跑不动一点,但是我们可以让 TT 只记录 SS 中节点的 dis\mathrm{dis} 正确与否,统计答案时再判定是否所有节点的 dis\mathrm{dis} 都被更新到了.复杂度 O(n3n)O(n3^n)

! D. 路径

太困难!!!

Day 3 下午

A. 集合

cic_i 表示 axi(mod9)a_x \equiv i \pmod 9xx 个数.一个数若能选 33 个,则选择任意个都是合法的,故直接枚举每个 ii 选多少个.

B. 染色

先将有交的路径并起来,这个可以直接暴力实现.

然后问题转化经典的 01 背包,注意到物品的重量和为 nn,故只有 O(n)O(\sqrt{n}) 个本质不同的物品,单调队列或二进制分组优化多重背包即可.

* C. 线段树

注意到出题人非常友善,查询区间长度形如 2k2^k

先考虑不带修改怎么做,我们可以预处理 mxk,i\mathrm{mx}_{k, i} 表示 [i,i+2k)[i, i + 2^k) 这一段区间的最大值,sumk,i\mathrm{sum}_{k, i} 表示 [i,i+2k)[i, i + 2^k) 这一段区间的答案,有转移:

sumk,i=sumk1,i+sumk1,i+2k1+mxk,i\mathrm{sum}_{k, i} = \mathrm{sum}_{k - 1, i} + \mathrm{sum}_{k - 1, i + 2^{k - 1}} + \mathrm{mx}_{k, i}

现在考虑带上修改,然后我们发现这个类似 ST 表的东西根本修不动.这时我们考虑一个根号分治,设置阈值 B=2kB = 2^k,预处理所有 iki \le kmxi,j\mathrm{mx}_{i, j}sumi,j\mathrm{sum}_{i, j},显然可以 O(B)O(B) 修改.查询时若区间长度 >B> B,暴力重算缺失的部分.总复杂度 O(n/B+B)O(n / B + B)BBn\sqrt{n} 时最优,即大概取 k=8k = 8

* D. 游戏

不妨设 fif_i 表示左手有 ii 枚硬币,右手有 11 枚硬币时,游戏期望还要进行的次数.

考虑进行几次 2 操作再进行 1 操作,令 t=log2it = \lfloor \log_2 i \rfloor 有如下方程:

fi=12t+1(t+1)+j=0t12j+1(fi(2j1)+1+(j+1))f_i = \frac{1}{2^{t + 1}} (t + 1) + \sum_{j = 0}^t \frac{1}{2^{j + 1}} (f_{i - (2^j - 1) + 1} + (j + 1))

稍微移项成能递推的形式:

fi+1=32fi2j=2t12j(fi(2j1)+1+(j+1))f_{i + 1} = \frac{3}{2} f_i - 2 - \sum_{j = 2}^t \frac{1}{2^j} (f_{i - (2^j - 1) + 1} + (j + 1))

然后发现所有元都可以写成 af1+ba f_1 + b 的形式,递推出 f2nf_{2n} 的表达式后即可解出 f1f_1

这 b 题卡常,得上个快速取模.

Day 4

A. 过量的子集和问题

若不存在两个相同的元素,则不存在解,否则直接选择两个相同的元素即可.

B. 那里没有括号

先考虑怎么求 ff,设 fl,r=f(S[l,r])f_{l, r} = f(S[l, r])

SlS_l 为右括号,则 fl,r=fl+1,rf_{l, r} = f_{l + 1, r};若 SrS_r 为左括号,枚举配对的右括号位置 kk,有转移 fl,rfl+1,k1×fk+1,rf_{l, r} \leftarrow f_{l + 1, k - 1} \times f_{k + 1, r}

然后发现 ff 要用来算异或,不能取模,但是我们可以记录 fmod998244353f \bmod 998244353 的值和 fmod232f \bmod 2^{32} 的值,分别记为 ppqq.则 lrfl,r(pl,rql,r)+ql,rlr(mod998244353)l \oplus r \oplus f_{l, r} \equiv (p_{l, r} - q_{l, r}) + q_{l, r} \oplus l \oplus r \pmod {998244353}

* C. 缩点是邪恶的

问题实际上是要我们最大化缩完点后的图的大小.

uu 有两条不同的出边,则可将两条出边指向的点合并,入边同理,故可将原图简化为每个点之多只有一条出边和入边.

由于缩点操作不能缩掉环,且一个长为 ss 的环能并入长为 tt 的环上的充要条件是 tst | s,故若简化后的图中存在环,则答案上界是所有环长的 gcd\gcd

若不存在环,则每个连通块都是有向链,直接将所有链首尾相连就是答案.

* D. 牛奶路列车

没写代码.\Huge\color{red}\text{没写代码.}

numl,r\mathrm{num}_{l, r} 为子串 [l,r][l, r] 对应的数字,len(x)\operatorname{len}(x) 为数字 xx 的长度,即 lgx+1\lfloor \lg x \rfloor + 1

先考虑找到最小的 bkb_k.显然最小化 bkb_k 相当于最小化划分出来后最后一段的长度,记 fif_i 表示最大的 jj,使得存在一种划分包含 [j,i][j, i].有转移:

i+1fj,j>inumfi,i<numi+1,ji + 1 \to f_j, j > i \land \mathrm{num}_{f_i, i} < \mathrm{num}_{i + 1, j}

再考虑最大化字典序,设 gig_i 表示最大的 jj,使得存在一种划分包含 [gi,j][g_i, j].有转移:

i1gj,j<inumj,i1<numi,gii - 1 \to g_j, j < i \land \mathrm{num}_{j, i - 1} < \mathrm{num}_{i, g_i}

都可以通过二分 LCP 优化!

Day 5 上午

A. 聚会

min{b,n}+min{g,n}n+1\min\{b, n\} + \min\{g, n\} - n + 1

B. 城市

首先可以一眼一个 DP,记 ancu\mathrm{anc}_u 表示 uu 的祖先链,depu\mathrm{dep}_u 表示 uu 的深度,设 fuf_u 表示在 uu 留宿的最小代价,有转移:

fu=minvancu{fv+(depudepv)au+bu}=minvancu{fvdepvau}+depuau+buf_u = \min_{v \in \mathrm{anc}_u} \{f_v + (\mathrm{dep}_u - \mathrm{dep}_v)a_u + b_u\} = \min_{v \in \mathrm{anc}_u} \{f_v - \mathrm{dep}_v a_u\} + \mathrm{dep}_u a_u + b_u

显然这玩意可以斜率优化,由于祖先链上的点的 dep\mathrm{dep} 递增,那么插入直线的斜率递增,可以对每个 aua_u 维护决策点位置,修改是后缀覆盖,反演一下就变成单点修改了,容易撤销.

* C. 机器人

若局面已经确定,首先有个典中典 DP:设 fi,jf_{i, j} 为在第 ii 列第 jj 行,能捡到最多的垃圾,转移就 fi,j=max{fi,j1,fi,j,fi,j+1}+ai,jf_{i, j} = \max\{f_{i, j - 1}, f_{i, j}, f_{i, j + 1}\} + a_{i, j},其中 ai,ja_{i, j} 为第 ii 行第 jj 列是否有垃圾.

打表发现,这个 DP 第二维任意两个元素的差不超过 55,我们将第二维的差分数组作为状态,这些状态之间有一些带概率的转移,相当于图上随机游走,我们可以通过高斯消元求出最后在某个状态的概率.而题目要求的相当于最大值增加 11 的概率,对每个状态的概率求和即可.

* D. 网络赛

Day 5 下午

A. T1

首先在最优策略下,手上不可能有多于 10610^6 个硬币,然后暴力模拟前 10610^6 轮即可.

* B. T2

若最终局面确定,则交换次数就是排列的逆序对数.

那么设 fi,j,k,0/1/2f_{i, j, k, 0 / 1 / 2} 表示 Y 用了 ii 个,K 用了 jj 个,其他字符用了 kk,最后一个是 Y / K / 其他字符的最小交换次数,枚举当前填什么即可转移.

! C. T3

太困难!!!

D. T4

A124197

然而不能直接算,查 FORMULA 发现计算式为:

1+n+i=1n1j=1idj[dmod2=1]1 + n + \sum_{i = 1}^{n - 1} \sum_{j = 1}^i \sum_{d | j} [d \bmod 2 = 1]

继续查表发现若令

fi=j=1id(i)=j=1ii/jf_i = \sum_{j = 1}^i d(i) = \sum_{j = 1}^i \lfloor i / j \rfloor

那么有

原式=1+n+i=1n1fifi/2\text{原式} = 1 + n + \sum_{i = 1}^{n - 1} f_i - f_{\lfloor i / 2 \rfloor}

不妨令

gn=i=1nfifi/2g_n = \sum_{i = 1}^{n} f_i - f_{\lfloor i / 2 \rfloor}

容易发现若令

hn=i=1nj=1ii/jh_n = \sum_{i = 1}^n \sum_{j = 1}^i \lfloor i / j \rfloor

那么有

gn=hnhn/2h(n1)/2g_n = h_n - h_{\lfloor n / 2 \rfloor} - h_{\lfloor (n - 1) / 2 \rfloor}

只需解决 hh 的计算即可.我们有

hn=i=1nj=1ii/j=j=1ni=jni/jh_n = \sum_{i = 1}^n \sum_{j = 1}^i \lfloor i / j \rfloor = \sum_{j = 1}^n \sum_{i = j}^n \lfloor i / j \rfloor

然后对于一个 jj,当 kji<(k+1)jkj \le i < (k + 1)j 时,i/j=k\lfloor i / j \rfloor = k,所以有

hn=j=1nj12(1+nj+1j)nj+1j+((nj+1)modj)(nj+1j+1)h_n = \sum_{j = 1}^n j \frac{1}{2} \left(1 + \left\lfloor \frac{n - j + 1}{j} \right\rfloor\right) \left\lfloor \frac{n - j + 1}{j} \right\rfloor + ((n - j + 1) \bmod j)\left(\left\lfloor \frac{n - j + 1}{j} \right\rfloor + 1\right)

然后就可以整除分块 O(n)O(\sqrt{n}) 计算了.

Day 6

A. 数学题

ii 的个位只能是 1,2,31,2,3,其他位只能是 0,1,2,30,1,2,3,直接数位 DP 即可.

B. 听音乐

垃圾做法.

首先,如果我们确定了一首歌最终听的次数,我们肯定会在第一次到这首歌的时候听完.

于是我们可以设计一个 DP,计算出从 11 升序 / 降序走到 ii 的最大收益.以升序举例,设 fi,jf_{i, j} 表示走到 ii,用了 jj 次操作的最大收益,有转移:

fi,j=maxk{fi1,k+12(ai+ai(jk2)bi)(jk1)}f_{i, j} = \max_k\left\{f_{i - 1, k} + \frac{1}{2}(a_i + a_i - (j - k - 2)b_i)(j - k - 1)\right\}

显然可以斜率优化.

然后最终的路径一定是往某个方向走一段之后回到 11 再走另外一个方向,将两个 DP 拼一下即可.

注意两个路径不要有重叠.

C. 选择美食

满足条件的 dd3-smooth 数,故只用凑 2233 的指数.

10910^9 内 3-smooth 数的个数很少,根据 这篇博客 大概只有 300300 个!故直接背包即可.

! D. 小 P 与出题

太困难!!!

Day 7

A. 可爱的背包

典.

B. 加边

典.

C. 奇怪的操作

为什么我总在写垃圾题啊?

考查修改一个位置的值会对哪些 cc 有影响,不妨设 limi\mathrm{lim}_i[1,i][1, i] 中第 bib_i 大的数,nxti\mathrm{nxt}_i[1,i][1, i] 中第 bi+1b_i + 1 大的值.假设我们将 aia_i 变成了 vv,考查所有 jij \ge icjc_j,分类讨论:

  1. ailimj,vlimja_i \ge \mathrm{lim}_j, v \ge \mathrm{lim}_j 时,改变量为 vaiv - a_i

  2. ailimj,v<limja_i \ge \mathrm{lim}_j, v < \mathrm{lim}_j 时,此时需要分类讨论 vvnxtj\mathrm{nxt}_j 的大小:

    1. vnxtjv \ge \mathrm{nxt}_j 时,改变量为 vaiv - a_i
    2. v<nxtjv < \mathrm{nxt}_j 时,改变量为 nxtjai\mathrm{nxt}_j - a_i
  3. ai<limj,vlimja_i < \mathrm{lim}_j, v \ge \mathrm{lim}_j 时,改变量为 vlimjv - \mathrm{lim}_j

  4. ai<limj,v<limja_i < \mathrm{lim}_j, v < \mathrm{lim}_j 时,改变量为 00

倒着扫一边处理询问即可,注意需要支持动态二维数点,我使用了树状数组套动态开点线段树.

D. 函数

原题是 AGC006D

带上区间查询就再二分一下距离中间最近的相邻两个相同的位置,这个可以用 ST 表维护区间相邻两个数的最大值的最小值.