NOI2022 集训题

xsy1748C/NOI2021-13C

description

给定 \(A,B,C\),构造两个长度为 \(n\) 的数组 \(x_i,y_i\),满足

\(\sum_{i=1}^nx_i^2=A\wedge \sum_{i=1}^ny_i^2=B\wedge \sum_{i=1}^n x_iy_i=C\)

\(A,B,C\leq 10^{18}\),要求 \(n\leq 20\)

solution

如果考虑实数范围内有解,那么有解条件是 \(A,B\geq 0,AB\geq C^2\)
对于 \(A,B\geq C\) 的情况,我们把数列分成三部分,第一部分 \(\sum x_i=A-C,y_i=0\),第二部分 \(\sum y_i=B-C,x_i=0\),第三部分 \(x_i=y_i,\sum x_iy_i=C\),我们开始先贪心选最大的,选两次之后 \(n\leq 10^5\),提前 dp 预处理出来最优分解,每一部分最多 6 个数
考虑有解条件,不妨设 \(A\leq B\),如果 \(B<C\) 的话,考虑让 \(x_i-=\lfloor\dfrac{c}{b}\rfloor y_i\),这个时候变成 \((a-2(c/b)c+(c/b)^2b,b,c\bmod b)\),此时 \(a\) 减小,\(c\) 至少减小一半,最多 \(O(\log c)\) 次就可以变成上一种情况
code

xsy1748B/NOI2021-13B

description

区间乘,区间求 \(\sum_{i=l}^ra_i^k\prod_{j\neq i}\frac{1-a_ia_j}{a_i-a_j}\),保证分母不为0
\(n\leq 3\times 10^5,0\leq k\leq 2\)

solution

推式子题,反向利用拉格朗日插值
code

ABC254H

description
给定两个 multiset A,B,每次可以把 A 中的一个 \(x\) 删去,再加入 \(2x\) 或者加入 \(x/2\)(取整),问能否把 A 变成 B,如果可以输出最小操作次数
\(n\leq 2\times 10^5,a_i\leq 10^9\)
solution
考虑建一棵 trie,但是这个 trie 从最高位开始建, \(x\times 2\) 相当于把一个 \(a\) 移到他的父节点,\(x/2\) 相当于移到左子树,如果需要移到右子树声明无解
code

xsy1861C/NOI2022-34C

description
\(n\times n\) 矩形,\((i,j)\) 有颜色 \(a_{i,j}\),问随机选一个矩形,这个矩形中不同颜色数量的期望
\(n\leq 1500\)\(a_{i,j}\) 在钦定的整数 \(m\)\([1,m]\) 中随机
solution
相当于是算一个颜色被多少个矩形包含,考虑扫描线,可以想到维护一棵笛卡尔树计算答案。因为矩阵是随机的,所以笛卡尔树树高是log,直接用 BST 维护这个笛卡尔树,每次暴力修改左子树的右链和右子树的左链即可
code

xsy1862C/NOI2022-35C

description
给定 \(m_i\),求 \(0\leq a_i\leq m_i\)\(a\) 序列个数,使得 \(a_i\) 的异或和为 0
\(n\leq 2\times 10^5,a_i\leq 2^{32}-1\)
solution
由 Subtask 3 可以得到一个提示,就是如果 \(a_i\) 有一位 \(j\) 是 0 而 \(m_i\) 是 1,在 \(j+1\) 以上的位 \(a_i\)\(m_i\) 相同,那么我不管剩下的数后 \(j-1\) 位异或起来是多少都能凑成 0
所以我们可以考虑枚举最大的 \(j\) 使得存在 \(a_p\)\(m_p\) 在这一位不同
于是可以 dp,\(f[i][x][y]\) 表示前 \(i\) 个数,第 \(j\) 位异或起来是 \(x\),有没有满足上面这个条件的数
考虑转移,设 \(c=m_i\&(2^{j-1})+1\),那么
\(m_i\)\(i\) 位为 1 的时候,如果 \(a_i\)\(j\) 位填1,那么方案数是 \(c\),如果填0,方案数是 \(2^i\),如果钦定这个位置是 \(p\) 方案为 1
\(m_i\)\(i\) 位为 0 的时候,只能填 0,方案数为 \(c\)
注意只有在 \(j+1\) 位以上 \(m_i\) 的异或和为 0 的时候才能加上答案 \(f[n][0][1]\),因为我们 \(j+1\) 位以上 \(a_i\) 强制选与 \(m_i\) 相同
注意特判 \(m_i\) 的异或和为 0 的情况单独计算
code

xsy1868A/NOI2022-36A

description
\(n\) 个人排成一列,开始钦定若干个人选,接下来对于一个人 \(i\),如果 \(1\sim i-1\) 被选的(包括钦定的和后来选上的)的人数比 \(i\) 要小,那么 \(i\) 也会被选上,问开始要最少钦定几个人选
\(n\leq 5\times 10^7\)
solution
显然最前面有连着一段都会被选上,而我们钦定的一定全都在这一段里
所以考虑倒叙,如果 \(a_i<m\)\(m--\),等到 \(i=m\) 的时候,这就是我们前面连着要选的一段了,直接贪心即可
code

xsy1868B/NOI2022-36B

description
\(f_0=0,f_1=1,f_i=af_{i-1}+bf_{i-2}\pmod p\),问是否存在 \(f_{n}=x,f_{n+1}=y\),如果存在输出最小的 \(n\),多次询问
\(0<x,y<p\leq 10^6,q\leq 10^6\)
solution
首先求数列通项,他的两个特征根分别是 \(A=\dfrac{a+\sqrt{a^2+4b}}{2},B=\dfrac{a-\sqrt{a^2+4b}}{2}\)
\(\Delta=a^2+4b=0\) 时,他的通项是 \(f_n=nA^{n-1}\),在 \(O(p)\) 的范围内找到 \(f_T=0\)
\(\Delta\neq 0\) 时,\(f_n=\dfrac{A^n-B^n}{A-B}\),考虑利用斐波那契循环节的推导方法

  • \(\Delta\) 是模 \(p\) 意义下的二次剩余,那么 \(f_{p-1}=\dfrac{1-1}{A-B}=0\)\(T\) 依然是 \(O(p)\)
  • \(\Delta\) 不是模 \(p\) 意义下的二次剩余,注意到 \(A^p=\Big(\dfrac{a+\sqrt\Delta}{2}\Big)^p=\Big(\dfrac{1}{2}\Big)^p(a+\sqrt\Delta)^p=\dfrac{1}{2}(a+\sqrt\Delta)^p\),因为 \(\Delta\) 是非二次剩余,因此 \(\Delta^{\frac{p-1}{2}}=-1\),因此对于 \((a+\sqrt\Delta)^p\) 按照二项式定理展开之后,低于 \(p\) 的项全部被消掉了,因此得到 \(A^p=\dfrac{1}{2}(1+\sqrt\Delta^p)=B\),因此 \(f_{p+1}=\dfrac{A^2B^2-A^2B^2}{A-B}=0\),依然是 \(O(p)\)
    所以,我们可以在 \(O(p)\) 的时间内找到 \(f\) 的第二个零点 \(T\),设 \(\lambda=f_{T+1}\),那么 \([T,2T)\) 中的数就是 \([0,T)\) 中的数乘上了一个 \(\lambda\)\([2T,3T)\) 就是 \([0,T)\) 乘上一个 \(\lambda^2\),因此可以直接处理 \(\lambda\) 在模 \(p\) 意义下的循环节,就可以计算了
    code

xsy1868C/NOI2022-36C

description
二维平面上有 \(n\) 个路障,路障之间不重合,不能走进路障内部,但是可以走在路障边缘,问 \((sx,sy)\)\((ex,ey)\) 的最短路
\(n\leq 2.5\times 10^5\)
solution
首先有一个结论,就是最多只会往三个方向走,因为注意到两个路障拼在一起依然是可以走过去的,因此定义 \(LU\) 路径为能往左走就往左走,否则往上走的路径,他一定可以走到平面边界,类似定义 \(LD,RU,RD\) 路径,这样平面被分成了 4 个区域,终点在哪个区域中就一定有一个方向是没用的
那么有了这个结论就好做了,不妨设不往左走,那么从左到右扫描线,遇到一个障碍物就把被挡住的走到左右两边,拿一个 set 维护,复杂度是均摊的所以可以暴力挪
code

xsy1869B/NOI2022-37B

description
给一个 \(n+1\) 个节点的树,和一个长度为 \(n\) 的序列 \(a_i\),选任意一个点作为起始点,每次选择一个有已经被选择过的相邻点的点选择上,并把这个点和之前选择过的相邻点之间的权值设为 \(a_i\),问树的直径最大是多少
\(n\leq 150\)
solution
考虑 dp,\(f[i][u][v]\) 表示前 \(i\) 个,直径扩展到了 \((u,v)\),最长的距离是多少,那么可以选择扩展一步,或者选择不扩展,这个时候需要扔到不在直径上的子树里,但是这样会带来一个问题,就是有可能我们给扔到一个将来要选为直径的子树里了
因此用 \([i][u][v][0/1][0/1]\) ,如果 0 表示 \(u/v\) 不会再扩张,如果是 \(1\) 表示现在选到了 \(u\)\(v\) 走一步的那个点,将来直径会扩展到 \(u\),这样就可以转移了
code

xsy1870A/NOI2022-38A

description
问 Thue-Morse 序列的 \([l,r]\) 在这个序列中第一次出现的位置
关于 Thue-Morse 序列参见原题
\(q\leq 10^5,l,r\leq 10^{18}\)
solution
利第三条性质
对于任意一个序列,我们有两种两两拆分的方式,如果他对应唯一的拆分方式,可以得到转移 \(f(l,r)=f(\lfloor l/2\rfloor,\lflooor r/2 \rfloor)+(l\bmod 2)\)
考虑什么时候对应唯一的拆分方式,就是 \(0101010101\) 这种的,他拆分完之后对应的分别是 \(11111\)\(00000\),而连续的 \(1\) 或者 \(0\) 最多只有两个,因此可以直接对于比较短的串暴力预处理,复杂度为 \(O(q\log(r-l))\)
code

xsy1870B/NOI2022-38B

description
给一张图,初始边全是白色边,对于原图上最短路距离为 2 的点对,连一条黑边,现在新图上,白色边边权为 \(a\),黑色边边权为 \(b\),问新图上 1 到每个点的最短路
\(n\leq 1.5\times 10^5,m\leq 3\times 10^5\)
solution
首先 \(b>2a\) 是简单的
然后我们先在原图上跑一个bfs,对于偶数层的点,显然答案就是 \((dis_i/2)b\),对于奇数层的点,有问题,因为他有可能走另一条全是偶数的路径过来了
因此我们只需要在 \(b\) 的图上跑最短路即可,这个可以考虑对于 \(u\),枚举所有和他相邻的点 \(v\),再枚举和 \(v\) 相邻的未入队\(w\),做 bfs
考虑这样做的复杂度,所有未成功入队的扩展都在三元环上,因此复杂度是 \(O(m\sqrt m)\)
code

xsy1870C/NOI2022-38C

descrption
\(n\) 个人,每个人有体力 \(a_i\),有 \(m\) 场比赛,第 \(i\) 场比赛要消耗的体力值为 \(i\),获得的收益也为 \(i\),现在要选出 \(kn\) 场比赛,按顺序排序之后,第 \(i\) 个人会打第 \(in+j(i=1,2,\cdots k)\),要求每个人打完之后体力值非负,求最大收益
\(n\leq 2\times 10^5,m\leq 10^9\)
solution
首先考虑枚举 \(k\)
\(b_i\) 表示 \(i\) 消耗的体力,\(d_i=b_i-a_i\) 表示不足的体力,我们的目标是 \(d_i\) 非正且 \(\sum |d_i|\) 最小
考虑先把所有比赛放在最后 \(kn\) 场,然后慢慢往前挪,如果我们在第 \(i\) 场(\(i<n\))往前挪一格,那么对应到 \(d\) 上相当于一个前缀减一,而第 \(i\) 个人到第 \(i+1\) 个人之间会多一场没人要的比赛。同时,我们也可以把 \([tn+1,tn+n]\) 整体往前挪,这样对应到 \(d\) 上需要全局减一
注意到第一种操作由于所有空比赛最多 \(m-kn\) 场,所以有操作次数限制,而第二种操作我们只需要让前缀-1的操作全部由最后 \(n\) 场来承担,一定可以给出一个方案,因此这一部分是没有操作限制的
如果不考虑前缀减一的次数限制,有一个很显然的贪心,设 \(suf_i\)\(d_i\) 的后缀最大值,答案就是 \(\sum suf_i-d_i\),如果有次数限制,只需要让 \(suf_i\) 再 max 上一个 \(\max(\max d_i-(m-kn),0)\) 即可
这样我们得到了一个 \(O(n\cdot \dfrac{m}{n})=O(m)\) 的做法
进一步考虑,发现在 \(k\) 增大的时候,后缀最大值(不包括 0)一定比他本身增加的速度要快,因此在 \(\max d\leq m-kn\) 的时候,在前半部分 \(suf_i>0\) 的时候,贡献随 \(k\) 的增加而增加,并且增加速度越来越快,后半部分 \(suf_i=0\) 的时候,贡献 \(k\) 的增加而减小,并且减小速度越来越快,因此这一部分是凸的,可以二分。而在 \(\max d> m-kn\),只有第一个 \(k\) 是有用的
复杂度 \(O(n\log(m/n))\)
code

xsy1871A/NOI2022-39A

description
给定 \(n\times n\) 的矩阵,每一行有参数 \(w_i,k_i\),用 \(f_i\) 表示第 \(i\) 行的所有区间中 mex 的第 \(k_i\) (重复计算)大值,求 \(\max f_i+w_i\),每一行在给定值域 \(m_i\) 的情况下随机
\(n\leq 10^4\)
solution
首先可以二分,有 \(O(n^2\log n)\) 的算法,然后 random_shuffle 一下,看一看第 \(i\) 行的 \(f_i\) 是否有可能比 \(ans-w_i\) 要大,如果大的话再二分,因为最长上升子序列期望是 \(\sqrt n\) 的,所以复杂度是 \(O(n^2+n\sqrt n\log n)\)
code

xsy1871B/NOI2022-39B

description
给定一棵树,构造一个长度为 \(m\) 的序列,值域为 \([1,n]\),满足 \(q\) 个限制条件,形如 \((r_i,a_i,b_i,x_i)\),表示在以 \(r_i\) 为根的时候,\(\operatorname{lca}(h_{a_i},h_{b_i})=x_i\)
\(n,m,q\leq 1000\)
solution
2sat,\((i,j)\) 为 true 表示 \(h_i\) 在子树里,约束条件有很多,比较恶心的一个是一个点的所有儿子里最多一个为 true,这个边数是 \(O(\deg^2)\) 的,所以三度化一下,就可以边数降到 \(O(\deg)\)
code

xsy1871C/NOI2022-39C

description
\(k\) 维空间,从 \((0,0,\cdots,0)\) 出发,每次任选 \(2k\) 个方向(每个维度 \(+1\) 或者 \(-1\))随机游走,问期望走到的格子的个数,答案乘上 \((2k)^n\)\(p\) 取模,\(p\) 不一定是质数
\(n\leq 6000,k\leq 10^9\)
solution
首先答案等于 \(n+1-[走到原来走过的格子的步数]\),用 \(F_d\) 表示从原点出发,走了 \(d\) 步,回到原点,期间没有回到原点的方案数,那么枚举一个位置 \(i\),再枚举第一次走到这里的时间,答案就是 \((n+1)(2k)^n-\sum (2k)^{i-d}F_d(2k){n-d}\)
发现答案和 \(i\) 无关,问题转化成求 \(F_d\)\(F_d\) 可以容斥,用 \(G_d\) 表示原点出发,走了 \(d\) 步,回到原点,不要求中间不回到原点的方案数,有 \(F_i=G_i-\sum_{i=1}^{n-1}F_iG_{i-j}\),问题转化为求 \(G_i\)
\(G_i\) 考虑枚举每一个维度,设 \(H_i=\sum\dbinom{i}{i/2}[i\bmod 2=0]x^i\),有 \(\operatorname{EGF}(G)=\operatorname{EGF}(H)^k\),但是问题在于在 \(p\) 不是质数的时候我们 EGF 不存在
但是注意到,\(\dfrac{c_n}{n!}=\sum \dfrac{a_i}{i!}\dfrac{b_{n-i}}{(n-i)!}\Rightarrow c_n=\sum a_ib_{n-i}\dbinom{n}{i}\),因此我们只需要每次做乘法的时候额外乘一个组合数就可以不需要利用逆元了
然后利用 \(G=H^k,G^\prime H=kH^\prime G\) 做递推即可,注意求导的时候组合数也需要发生一定的变化
code

xsy1872A/NOI2022-40C

description
有一个变量 \(x\) 初始 \(x=1\),每次可以选择 \(a_1,\cdots,a_m\) 中的一个,使得 \(x=(x+a_i)\bmod n\),或者选择 \(b_1,\cdots,b_k\) 中的一个,使得 \(x=xb_i\bmod n\),问 \(x\) 变成 \(i=0,1,\cdots,n-1\) 的最小操作次数
\(n,m,k\leq 10^5\)
solution
暴力就是bfs,考虑优化,加法可以用 bitset 实现,乘法找到原根之后同样可以 bitset
code

xsy1864A/GZOI2022-1A

description
数列 \(a_n\),定义一个置换为他的每个轮换的最小值的乘积,设 \(b_i\) 表示 \(i\) 个轮换的所有置换的代价之和,求 \(\gcd(b_1,\cdots,b_n)\bmod 998244353\)
\(n\leq 5\times 10^5\)
code
solution
首先类似第一类斯特林数写出转移,在 \(a_i\) 排序后有
\(f_{i,j}=a_if_{i-1,j-1}+(i-1)f_{i-1,j}\),写出生成函数,\(F_n=\prod (a_ix+i-1)\),然后利用一个神秘的定理:
对于多项式 \(f,g\)\(h=f\times g\)\(\gcd([x^i]h)=\gcd([x^i]f)\gcd([x^i]g)\),利用这个答案就是 \(\prod\gcd(a_i,i-1)\)
下面证明这个结论,不失一般性的,只需证明 \(\gcd(f)=\gcd(g)=1\) 时,\(\gcd(h)=1\) 即可,假设 \(p>1,p|\gcd(h),p\neq|\gcd(f),p\neq|\gcd(g)\),设 \(x\)\(f\) 中最高的一个不整除 \(p\) 的项,\(y\)\(g\) 中最高的一个不整除 \(p\) 的项,那么 \(h_{x+y}\) 除了 \(f_xg_y\) 贡献的这一项以外其他的均证出 \(p\),所以 \(h_{x+y}\) 不整除 \(p\),因此矛盾
code

xsy1864B/GZOI2022-1B

description
给定 \(a_i,b_i\),对于每个 \(i\),可以选择交换或者不交换 \(a_i,b_i\),要最大化 \(\sum_{i,j}\min(a_i,b_j)\),构造方案
\(n\leq 2\times 10^5\)
solution
不妨设 \(a_i\leq b_i\),对于 \(a_i,b_i,a_j,b_j\) 之间的贡献,交换 \(a_i,b_i\) 或者 \(a_j,b_j\) 中的一个后,讨论三种情况发现答案变化量是他们的交的大小
问题变成了数轴上有 \(n\) 条线段,给一些线段染色,使得任意两条异色线段的交的和最大
对于点 \(i\),设他被覆盖了 \(k\) 次,答案理论上界是 \(\sum \lfloor \frac{k}{2}\rfloor\lceil\frac{k}{2}\rceil\),下面构造,给 \(a_i\)\(b_i\) 连一条边,再对于相邻的两个奇度数的点连一条边,这样每个连通块都有欧拉回路,跑欧拉回路,从左往右走的边设成黑色,从右往左的设成白色,因为一个位置最多只有一条新加入的边,因此取到上界
code

xsy1864C/GZOI2022-1C

description
\(T\) 次询问,每次给定一个序列 \(a_i\),构造恰好 \(k\) 个不相交的区间,使得这些的异或和为 \(p\)
\(T\leq 1000,n\leq 64,a_i\)\([0,2^{64})\) 中均匀随机
solution
注意到线性基里的数非常多,外面大概率只有一两个,因此暴力枚举外面的数选不选,看能否构成 \(k\) 个区间即可
code

xsy1863A/GZOI2022-2A

description
\(n\) 个怪,打死 \(i\) 需要消耗 \(a_i\) 的生命,打死后回复 \(b_i\) 的生命,问打死 \(k=1,2\cdots,n\) 只怪需要的最小的初始血量
\(n\leq 3\times 10^5\)
solution
首先考虑 \(k=n\) 的情况,这是一个经典的贪心,我们先打 \(a_i\leq b_i\) 的,这一部分显然按照 \(a_i\) 升序排序,然后打 \(a_i>b_i\) 的,这一部分按照 \(b_i\) 降序排序
回到原问题,显然 \(a_i\leq b_i\) 的我们打的是一个前缀,但是 \(a_i>b_i\) 的则不是,因此我们只考虑后半部分,问题转化为后半部分打了 \(j\) 只需要的最少初始血量
有一个显然的 dp,\(f_{i,j}=\min(f_{i-1,j},\max(f_{i-1,j-1}-b_i,0)+a_i\)
观察这个 dp,因为 \(b_i\) 是增的,在 \(\leq b_i\) 的部分之后都不会变,并且数学归纳发现这个 dp 是凸的
因此可以平衡树维护 dp,或者用一个堆维护差值,每次弹出最小的
code

xsy1863B/GZOI2022-2B

description
现在有一个排列,每次可以询问一个排列,交互器返回这个排列和询问的排列的公共边数(排列相邻两个元素之间有一条边),试确定这个排列
\(n\leq 500\),询问次数 \(\leq 8000\)
solution
首先发现可以通过 4 次询问确定一个三元环上的所有的边,因此先 \(O(n)\) 问出和 1 相邻的边的连通性,和 \(n\) 相邻的边的连通性,和 \(j-i=1\)\((i,j)\) 的连通性
接下来假设 \(j-i<d\) 的所有边的连通性我们已经知道了,考虑求出 \(j-i=d\) 的所有边的连通性
发现我们可以利用一次询问问出 \(i\in[l,r],j-i=d\) 的边数,即 \([l,r]\) 之间的边按照模 \(d\) 分类蛇形连成一条链,发现其他的 \(j-i\neq d\) 的边要么有一个端点是 \(1\) 或者 \(n\),要么 \(j-i<d\),因此可以直接减去,因此可以大力二分,询问次数 \(O(n\log n)\)
code

xsy1863C/GZOI2022-2C

description
一个排列 \(P\),每次可以进行一次操作:交换一对逆序对,如果经过若干次操作 \(P\) 可以变成 \(Q\),称 \(P\) 可达 \(Q\),现在有 \(m\) 个排列,对于每个排列 \(p_i\),求有多少个 \(p_j\) 可达 \(p_i\)
\(n\leq 9,m\leq 3\times 10^5\)
solution
发现瓶颈在于变化方式不唯一,因此我们考虑对于每个 \(P\)\(Q\) 要有唯一的路径
注意到,\(i<j<k,p_i>p_j>p_k\) 时,交换 \(p_i\)\(p_k\) 是毫无意义的,因为我们可以先交换 \((i,j)\),再交换 \((i,k)\),也就是说,我们只变换 \((i,j)\) 满足 \(p_i\)\(j\) 前面第一个 \(>p_j\) 的元素
考虑一个 \(p\)\(q\) 的变换,先把 \(q_1\) 调整到最前面,然后递归后 \(n-1\) 个元素
因此考虑一个 dp,\(f_{i,j,k}\) 表示当前排列为 \(i\),第一个没确定的位置是 \(j\)\(q_j=p_k\)
转移考虑:\(f_{i,j,k}\to f_{i,j,k+1}(k\neq n)\)\(f_{i,j,k}\to f_{i,j+1,j+1}(k=n,j\neq n)\)\(f_{i,j,k}\to f_{i^\prime,j,k}(p_j,p_k 可以交换)\)
复杂度 \(O(n!n^2)\),但是 \(O(n!n^3)\) 也能过
code

xsy1865A/GZOI2022-3A

desciption
给一个仙人掌,每条边有权值 \(x_i,y_i\),现在求这个仙人掌的最小权生成树,权值定义为选的边集的 \(\sum x\sum y\)
\(n\leq 3\times 10^5\)
solution
首先一个环上恰好断一条边,因此 \(x,y\) 分别变成 \(\sum x-x,\sum y-y\),这里的 sigma 是在环上求和
考虑一个 dp,\(f[i][j]=\min(f[i-1][j-x]+y)\),最后要求 \(f[n][i]\times i\),相当于是用一个反比例函数去截他,所以只有下凸壳上的点有用,直接分治闵可夫斯基和即可
code

xsy1866A/GZOI2022-4A

description
一个数列,单点修改,询问有多少个区间没有重复元素
\(n\leq 2\times 10^5\)
solution
\(lft_i\) 表示 \(a_i\) 上一次出现的位置,答案就是 \(n(n+1)/2-\sum_{i=1}^n\max_{j<i}lft_j\),惊奇的是,在单点修改 \(lft\) 的时候,后面这个 sigma 是可以用线段树维护的,\(O(n\log^2n)\),细节可见代码
code

xsy1866C/GZOI2022-4C

description
给定一棵树,边有边权,另外有一个完全图,\(u,v\) 的边权是 \(u\)\(v\) 在树上的最短路
每次树上路径加,询问完全图上 \(u\)\(v\) 的最大流
\(n\leq 10^5\)
solution
\(deg_i\) 表示完全图上 \(i\) 的出边的边权之和,发现是一个完全图,所以可以大胆猜测答案是 \(\min(deg_u,deg_v)\),证明见题解
那么考虑维护这个东西,对于一条边 \((v,faz_v)\),如果我们把他的边权加上 \(w\),对于 \(v\) 子树里的点,\(deg\) 加上 \((n-siz_v)w\),对于子树外的点,\(deg\) 加上 \(siz_vw\),那么相当于子树加 \((n-2siz_v)w\),全局加 \(siz_vw\)
发现查询是单点查询,所以转化成查询链,于是就可以树剖线段树维护了
code

xsy1867A/GZOI2022-5A

description
\(2\times n\) 的网格图,每个点有边权 \(a_1,\cdots,a_{2n}\),现在要找这个图的一棵生成树,使得 \(\sum a_ia_jdis(i,j)\) 最小,输出最小值
\(n\leq 3000,a_i\leq 10^4\)
solution
注意到,对于每一个竖着的 \(i\)\(i+n\) 的边,按照这个东西切成几段,中间的每一段都恰好有一条横着的边没有选,所以可以考虑 dp,\(f[i][0/1]\) 表示现在没选的边是 \((i,i+1)\) 还是 \((i+n,i+n+1)\),转移可以枚举一个 \(j\) 转移,中间在枚举竖着的那条边的位置 \(k\),复杂度是 \(O(n^3)\)
考虑优化,注意到,对于 \(j\) 固定,\(i\) 增加是 \(k\) 也增加,因此 two pointers,复杂度 \(O(n^2)\)
code

xsy1867B/GZOI2022-5B

小田急线-day2-下北泽 观察性质,线段树维护
code

xsy1867C/GZOI2022-5C

description
\(n\) 个区间 \([l_i,r_i)\),每次选择覆盖未被选择的线段中还没有被覆盖部分的长度最小的那个,进行覆盖,问覆盖的顺序
首先如果所有区间没有互相包含的关系,那么可以直接线段树维护最小值和最小值位置
发现如果 \([l_1,r_1)\) 包含 \([l_2,r_2)\),那么第一个区间一定在第二个区间之后,因此我们需要动态询问现在有几个区间新变成了没有包含任何区间
这个可以用线段树,每次询问右端点 \(\leq r\)\(l\) 最大的,直接线段树二分即可
还需要一个树状数组求当前还有多少没被覆盖
code

xsy1877A/GZOI2022-9A

description
求第 \(n\)\(x\) 满足 \(x(10^k-1)\) 的十进制表示中没有 \(9\)
\(n\leq 10^{18},k\leq 18\)
solution
考虑从高到低确定位数,判断一个数是 \(10^k-1\) 的倍数就和 \(k\) 位分一段求和
然后数位 dp 瞎搞搞,细节多
code

xsy1880A/GZOI2022-10A

description
\(n\) 个车站排成一排,车站有客流量 \(a_i\),等级为 \(j\) 的列车会在所有 \(a_i\geq j\) 的车站停车,从 \(i\) 出发乘坐任意等级列车,向左乘坐一站需要 \(l_i\) 的花费,向右乘坐一站需要 \(r_i\) 的花费,保证 \(l_i\leq l_{i+1},r_i\geq r_{i+1}\)\(q\) 次询问 \(x\)\(y\) 的最小花费
\(n,q\leq 3\times 10^5\)
solution
显然一个点往上走只能走到左右第一个比他大的位置 \(L_i,R_i\)
注意到由于 \(l\) \(r\) 的性质,在 \(L_i,R_i\) 等两部分的点之间左右横跳的时候,如果想往上走,一定不会往下走,如果想往下走一定不会往上走
考虑构建这样一棵树,把 \((x,L_x),(x,R_x)\) 这样的边看成点,\((x,L_x)\) 的父亲设成 \((R_x,L_x)\),等等,维护矩阵 \([dis(x),dis(x^\prime)]\) 这样最短路从儿子到祖先的转移 可以写成一个 \(2\times 2\)\((\min,+)\) 矩阵,直接倍增矩阵乘法即可
注意到如果 \(a_i=a_{L_i}\) 这种会造成一些神秘恶心的分类讨论

可以再写一遍

code

xsy1880C/GZOI2022-10C

description
定义字符串序列 \(F_n\)

  • \(F_1=dt\)
  • \(F_n=F_{n-1}F_{n-1}t\)
    \(F_n\) 的本质不同的子序列个数
    \(n\leq 10^{18}\)
    部分分:\(n\leq 10^6,n\leq 10^9\)
    solution
    \(f_{i,1}\) 表示 \(d\) 开头的子序列个数,\(f_{i,2}\) 表示 \(d\) 开头,贪心选取后选到最后一段 \(dttt\) 里面(也就是再添一个 \(d\) 就搞到第二段里了) 的方案数,\(f_{i,3}\) 表示 \(d\) 开头,选到最后一个 \(t\) 的方案数,\(f_{i,4},f_{i,5},f_{i,6}\) 分别换成 \(t\) 开头。
    这样不难搞到一个 \(O(n)\) 的转移,可以过 \(n\leq 10^6\)
    然后分段打表过 \(n\leq 10^9\)
    这个时候发现 \(n\leq 799039879\) 的时候答案是一个 2 的幂次,直接快速幂即可
    code

xsy1882A/NOI2022-41A

description
看题
solution
考虑二分答案,看答案是否能 \(\geq x\)
考虑如何 check 这个东西,首先选 \(v<x\) 的显然是没意义的,发现如果后面不全选,而 \(\geq x\) 了,那么由盐水原理,再加上一个 \(>x\) 的依然是 \(\geq x\)
所以找到 \(x\) 后最差肯定是全取 \(l\)
直接二分+bit或者线段树二分即可
code

xsy1882B/NOI2022-41B

description
看题
solution
发现要么一直往一个方向走,要么先往一个方向走,然后掉头
第一种直接倍增哈希就可以
第二类发现掉头的时候一定是 2 1 或者 1 2 这种情况,并且掉头之后肯定要一直走2,所以这种也可以类似的倍增哈希
code

xsy1882C/NOI2022-41C

description
看题
solution
有解条件即每个点度数都相等
考虑从小到大枚举 \(i\),优先满足 \(i\) 的连边
枚举 \(x,y\) 满足 \(G(i,x)&&!H(i,x)&&!G(i,y)&&H(i,y)\),接下来问题就是枚举一个 \(z\) 使得可以交换
发现有的时候 \(G\) 图上不一定存在这样的 \(z\),但是注意到 \(G\)\(H\)\(x,y\) 的去掉和 \(i\) 相连的边之后度数一定都相等,因此至少存在一个满足条件的,如果 \(G\) 满足条件就 \(G\) 上搞,否则修改 \(H\),这类操作最后倒序插到最后即可
code

xsy1885A/NOI2022-42A

description
\(n\) 个点 \(m\) 条边的简单无向图,给每条边定向使得这个图强联通,求最小的代价,一条边两种定向方式代价不同
\(n\leq 18\)
solution
首先每条边先选取 \(\min(g_{x,y},g_{y,x})\),接下来考虑构造这个强联通分量,相当于是一堆环套在一起,假设我们现在选取了一个集合 \(S\),我们选取 \(x\in S,y\in S\),寻找一条路径从 \(x\) 走到 \(y\),不经过在 \(S\) 里面的点,然后把走过的点添加到 \(S\) 集合当中,就完成了一次扩展
有了这个性质就可以状压 dp 了,用 \(f_{i,S,tar}\) 表示现在在 \(i\),集合为 \(S\),想要走到 \(tar\),转移可以做到 \(O(n^32^n)\),注意 \(x\to y\to x\) 这种情况要避免掉,因为这样 \((x,y)\) 被定了两个方向
code

xsy1885B/NOI2022-42B

description
给一个序列 \(a_1<a_2<\cdots<a_n\),问这个序列有几个排列满足任意相邻元素绝对值不等于 \(k\)
\(n\leq 5\times 10^3,k\leq 10^6\)
solution
考虑容斥
发现相当于有相互独立的几条链,考虑生成函数 \(A(x)=x+2x^2+2x^3\cdots\),对于一条长度为 \(m\) 的链,他被当成 \(k\) 个点的方案数就是 \(h_k=[x^m]A^k(x)\)
\(A(x)\) 很特殊,\(h(k)\) 可以 \(O(n^2)\) 求出来
然后把所有 \(h(k)\) 暴力卷起来就好了
code

xsy1888A/NOI2022-44A

description
现在有一个 \(n\) 个完全图拼起来的图,每部分有 \(a_i\) 个点,求他的补图的生成树个数
\(n\leq 200000\)
solution
把 matrix tree 矩阵写出来,可以得到答案为 \(s^{n-2}\prod(s-a_i)^{a_i-1}\)
code

xsy1888C/NOI2022-44C

description
给定一个长度为 \(n\) 的序列 \(a_i\)\(s_i\),\(s_i\) 初始为 \(0\),和常数 \(k\)
可以操作 \(s\),把连续 \(k\)\(0\) 变成 \(1\) 或者 \(1\) 变成 \(0\)
可以进行任意多次,求 \(\sum a_is_i\) 的最大值
\(n\leq 500\)
solution
注意到 \(\bmod k\) 的意义下每个位置是互相不干扰的,考虑我们最开始把 \([x,x+k-1]\) 变成了 \(1\),最后他们对应在区间 \([l,r]\) 上,那么 \(s_l=1,s_r=1,[l,r]\) 里面有 \(k\)\(1\),并且模 k 的值一定是从 \(x\bmod k\)\(x+k-1 \bmod k\) 递增的,因此可以区间 dp,用 \(f[l][r]\) 表示 \(s_l=1,s_r=1\) 的答案,\(g[l][r]\) 表示最终的答案,复杂度 \(O(n^3/k)\)
code

xsy1890A/NOI2022-45A

description
\(n\times m\) 矩阵,元素是 \(1\)\(nm\) 的排列,他有 \((2^n-1)(2^m-1)\) 个非空子矩阵
一个矩阵是好的当且仅当他的每一行和每一列是有序的(升序或降序),问这个矩阵有多少个好的非空子矩阵
\(n,m\leq 20\)
solution
\(f_{i,S}\) 表示第 \(i\) 行必须选,两行之间的对应位置大小关系为 \(S\) 的方案数,\(O(n^22^n)\)
code

xsy1890B/NOI2022-45B

description
\(n\) 个物品,两个参数 \(x_i,v_i\)\(x_i\) 互不相同,获得 \(i\) 需要花费 \(x_iv_i\) 点体力,获得 \(v_i\) 的价值
\(m\) 次操作,每次可以删掉一个物品或者询问当前有 \(k\) 点体力时可以获得的最大的价值
\(n,k_{\max},x_i,x_iv_i\leq 2\times 10^6,m\leq 5000\)
solution
首先我们发现可能被选的物品不太多,选取参数 \(b\),那么 \(\leq b\) 的部分最多选 \(O(b)\) 个,\(>b\) 的部分,考虑每个 \(c\in[1,k/b]\),我们肯定选的是 \(v_i=c\) 的一个前缀,这是一个类似调和级数的东西,是 \(O(\dfrac{k}{b}\log n)\)
平衡一下复杂度所以我们可能选的是 \(O(\sqrt{k\log k})\) 级别的
接下来考虑数据分治,对于 \(x_i\leq B\) 的部分,我们暴力做背包,对于 \(x_i>B\) 的部分,我们用 \(g_i\) 表示收集到 \(v_i\) 价值的最小的体力,这边是 \(O(\dfrac{k}{B})\) 的,询问时我们枚举 \(g_i\),查询对应的 \(f_i\)
考虑这样做的复杂度是 \(O(kB+\dfrac{k}{B}\(\sqrt{k\log k}+m)\),平衡一下,将 \(m\) 看做 \(O(\sqrt{k\log k})\),得到复杂度 \(O(k^{5/4}\log^{1/4}k)\),可以通过
code

xsy1892A/NOI2022-46A

description
交互题,需要猜一个排列
\(1,i,j\) 返回 \(a_i,a_j\) 大小关系
\(2,i,j,k\) 返回 \(a_i,a_j,a_k\) 中位数的值
操作 1 只能用 2 次,操作 2 只能用 \(2n\)
\(n\leq 5\times 10^5\)
solution
考虑操作 1 是用来区分 1,2 和 \(n,n-1\) 的,相当于只有操作 1
考虑递归构造,每次添加一个 \(a_x\),维护最大值,最小值,次大值,次小值,最大值的值,次小值的值注意最大值次大值我们目前无法区分,最小值次小值同理,每次询问最大值 最小值 \(x\),根据返回结果可以做到 \(2\) 次操作内添加一个数
code

xsy1894B/NOI2022-47B

description
一个可重集,初始为 \(1,2,\cdots,n\),每次可以删除 \(x,y(x\leq y)\),加入 \(x+y,y-x\),使得所有数相同,对于这个相同的值的最小值构造一组方案
\(n\leq 10^5\),操作次数 \(\leq 5\times 10^5\)
solution
考虑如果最后的这个值 \(r\) 有一个奇质数因子 \(p\),因为初始至少有一个不是 \(p\) 的倍数,那么他的 \(x+y,y-x\) 中一定有一个也不是 \(p\) 的倍数,所以 \(r\) 一定是 \(2\) 的幂,那么显然就是 \(\geq n\) 的最大的 \(2\) 的幂
对于一个 \(v=2^k\),如果另外有一个 \(0\),那么可以 \((0,v)\to (v,v)\to (0,2v)\) 把他翻倍,因此我们只需要把所有数变成 2 的幂,再搞一个 0 出来
构造方法是把 \((n,2^r-n),(n-1,2^r-n+1)\cdots\) 配对,这样可以变成一个规模至少变成一半的子问题,递归下去最后一定会出现一个 0
code

xsy1894C/NOI2022-47C

description
一个 1 到 \(n\) 的排列,每个位置可能是 + 或者 -,每次可以选择一个前缀反转并乘 \(-1\),构造使得最后变成 \(1,2,\cdots n\),操作次数 \(\leq 2n\)
\(n\leq 2000\)
solution
首先每次可以让 \(n\) 归位,得到一个 \(3n\) 的做法
进一步可以考虑 如果 \(x,x+1\) 或者 \(-x-1,-x\) 这样的出现了,可以用胶水把这俩黏在一起,问题同样降低了一个维度
因此各种讨论就可以用 \(2\) 次操作让 \(n\) 减一
code

xsy1900A/NOI2022-51A

description
一个 \(n\) 个点的无向图,每个点度数至少 \(n-3\),并且最多只差 \(n\) 条边完全,问生成树个数
\(n\leq 3\times 10^6\)
solution
发现补图要么是孤点要么是环要么是链
考虑容斥,钦定选一些补图上的边,形成了一些连通块,\(n\) 个点,有 \(k\) 个大小为 \(a_1,a_2\cdots a_k\) 的联通块的方案数是 \(n^{k-2}\prod a_i\)
考虑环如何转化为链,如果第一段有 \(x\) 个点,那么我可以转 \(x\) 次,所以相当于把第一段的方案数乘上两次就变成链了,于是可以 \(O(n^2)\) dp
进一步的我们可以发现不需要记录连通块个数,直接每次乘个 \(-n\) 就好了
code

posted @ 2022-06-15 10:19  YuukiYumesaki  阅读(250)  评论(0编辑  收藏  举报