Pakencamp 杂题选刷
sunkuangzheng · · 个人记录
2023
Day 1
G MST (Easy) \color{green}\checkmark
给定序列
a(|a_i| \le 10^6) ,构造n(n \le 2\cdot 10^5) 个点的无向图,点i,j 的边权是a_ia_j ,求图的最小生成树。
唐氏。首先给
考察
如果有负数做法基本相同,答案是最小的负数乘上正数的和,加上最大的正数乘上负数的和。
复杂度可以线性。
K Or Set \color{green}\checkmark
给定长为
n(n \le 2 \cdot 10^5) 的序列a(0 \le a_i < 2^m,m \le 30) ,定义一个序列的权值为:
- 初始时变量
x = 0 。- 对于
i = 1,2,\ldots,n 依次执行,如果x | a_i \ne 2^m - 1 ,则x \gets x | a_i ,否则不变。- 序列的权值即为
x 的最终值。你可以任意重排序列,问最终可以产生多少种不同的权值。
笑点解析:这题 *2800。
若只。首先注意到,所有或完以后会到达
直接枚举 A 的或和里缺少哪一位
L Range Mex Sum Min \color{green}\checkmark
给定排列
p(n \le 5 \cdot 10^5) ,有的地方已经填好,有的地方还没填。请你补全排列p ,使得排列p 的所有子区间的\text{mex} 之和最小。
唐氏。
给定
n(n \le 2 \cdot 10^5) ,求一个n 阶排列p 使得\bigoplus_{i=1}^n (p_i+i) 的值最大,输出方案。
若只打表题。设
- 观察
1 :答案的上界是4d-2 。- 首先答案不会超过
4d-1 。由于\sum p_i + i 是偶数,故末尾不可能是1 ,因此上界是4d-2 。
- 首先答案不会超过
- 观察
2 :将[1,2,\ldots,n] 翻转一个区间一定可以得到最优解。- 不会证,打表出奇迹。
- 观察
3 :对于每个n ,翻转的区间如下:
32 15 16
33 30 32
34 13 16
35 31 32
36 11 16
37 30 32
38 9 16
39 31 32
40 7 16
41 30 32
42 5 16
43 31 32
44 3 16
45 30 32
46 1 16
47 31 32
48 7 8
49 30 32
50 5 8
51 31 32
52 3 8
53 30 32
54 1 8
55 31 32
56 3 4
57 30 32
58 1 4
59 31 32
60 1 2
61 30 32
62 0 0
63 31 32
其中第一列是
规律:
- 对于
n \bmod 4 = 3 ,l = d-1,r=d 。 - 对于
n \bmod 4 = 1 ,l = d-2,r=d 。 - 对于
n \bmod 2 = 0 ,初始时l=d-1,r=d ,随后n 每增加2 ,l = l- 2 。当l<0 时,r 除以2 同时l = r -1 。
根据这个规律直接模拟即可。
证明不会,我也不知道官方题解写的什么做法,日语看不懂一点。
P MST (Hard) \color{red} \times
给定序列
a,b(|a_i|,|b_i| \le 10^6) ,构造n(n \le 2\cdot 10^5) 个点的无向图,点i,j 的边权是a_ia_j+b_ib_j ,求图的最小生成树。
考虑使用 b*** 算法,问题可以基本转化为:
- 插入
(x,y) 。 - 给定
(a,b) ,查询ax+by 的最小值。
这一部分是 ABC244H。注意到
Day 2
B Salesman X \color{green}\checkmark
给定一棵
n(n \le 2 \cdot 10^5) 个点的树和2m 个关键点x_1,x_2,\ldots,x_m,y_1,y_2,\ldots,y_m ,要求:
- 第一天从
1 出发,以任意顺序遍历前m 个关键点x_1,x_2,\ldots,x_m ,并在其中某一个停下。第二天从这个点出发,以任意顺序遍历后
m 个关键点y_1,y_2,\ldots,y_m ,最后前往给定的终点s 。求行走的最小总代价和。
糖。首先考虑怎么计算第一天停在
然后我们已经得到了第一天停在
C Arithmetic Progression and ... \color{green}\checkmark
有一个长为
n(n \le 2 \cdot 10^5) 的等差数列a_i = ki + l(a_i \le 10^{18}) ,但是有\lfloor \dfrac{n-1}{2} \rfloor 项被篡改了。你得到了a 重排后的序列,请你还原k,l 。保证有解。
等差数列必然满足
注意到等差数列满足
H Two PCities \color{green}\checkmark
DS 好玩捏。
给定一棵
n(n \le 10^5) 个点的无权树和一张无向无权图G ,如果(i,j) 在树上距离大于常数k 则在图上有一条边。q(q \le 10^5) 次询问u,v 在图G 上的最短路。
一个很直观的想法是,直接走直径。从
判定答案是否是
考虑边分治,对于左子树的每一个
官方题解里有一个简洁的做法:找到路径中点,则必定一边离
Day 3
B AND \color{green}\checkmark
- 给你一个数组
a(n \le 2 \cdot 10^5,a_i < 2^{30}) ,每次你可以选择两个相邻元素i,j 并把a_i \gets a_i \& a_j (不一定要求i<j )。数组的权值即为最小的操作次数,如果无解为-1 。
糖。
首先注意到,如果序列里有
考虑枚举位置
求子区间的答案等价于求
G MOD \color{red} \times
给定数组
b(n \le 2 \cdot 10^5) 和m(m \le 2 \cdot 10^5) 条边(u_i,v_i) 。你有一个初始为0 的数组a ,可以进行任意次操作,每次可以选择一条边并给a_u,a_v 同时加一。问能否使b_i \equiv a_i \pmod p 对所有i 成立,其中p 是一个全局给定的数(不保证是质数)。
很好的题啊,除了我不会以外都很牛!
首先进行一些最基本的观察:
- 观察
1 :如果这个图不存在环(一棵树),那么合法操作是唯一的。且合法的充要条件是,奇偶深度的点权和相等。 - 观察
2 :在上面观察的基础上,我们注意到,如果这个图是二分图,我们还是可以很容易的找到充要条件:左右部点点权和相等。
注意到剩下的情况里,图一定存在奇环,我们希望用奇环做一些调整。首先,不在奇环上的部分可以当作森林处理,我们计算出新的
注意到
2022
Day 1
I Forgotten Sequence \color{green}\checkmark
你需要构造一个序列
a(n \le 2 \cdot 10^5) ,有m 条限制,每一条限制形如:a_x = a_y 或a_x \ne a_y 。求字典序最小的序列a ,或报告无解。
并查集维护数字的相等关系,贪心构造。
不知道这种唐氏题是咋评到 2000 以上的。
J An Unusual King in Paken Kingdom \color{green}\checkmark
给定一棵树和
q(n,q \le 2 \cdot 10^5) 次询问,每次询问u,v 两点之间路径上边权的中位数,
主席树板子,谔谔。
K Beautifulness \color{green}\checkmark
给定序列
a(n \le 2\cdot 10^5) 和q(q \le 2 \cdot 10^5) 次询问,每次询问一个区间有多少种不同的前缀\max 。
由于不带修且可离线,我们不需要写单侧递归。直接将所有询问离线,从后向前扫描线扫
L Mex on Blackboard 2 \color{green}\checkmark
给定序列
a(n \le 2000) 和整数k(k \le 2000) ,你需要做k 次操作。一次操作是选择当前a 的一个子序列并把这个子序列的\text{mex} 。问最后可以得到多少不同的序列a ,对998244353 取模。
注意到如果
注意到如果插入的
M 01 Tree \color{green}\checkmark
你有一颗
n(n \le 5 \cdot 10^5) 的树,每个点可以涂黑白两种颜色,已经有k 个点确定颜色。还有n 条限制:点a_i 和其所有儿子颜色必须和点i 一样。构造或报告无解。
若只。
考虑直接并查集暴力合并会有什么问题,复杂度可能被重复的
N Paken Machine \color{green}\checkmark
给定数
x,t,p 和数组a_0,a_1,a_2,b_0,b_1,b_2 。第i 次操作会令x \gets (a_{i \bmod 3}x + b_{i \bmod 3}) \bmod p 。问x 第一次等于t 是第几次操作,或报告无解。保证p 是质数,且\textbf{0} \le a_i,b_i,x,t < p \le 10^9 。
注意到操作在模
然后特别注意,
O Paken Land \color{green}\checkmark
给定一棵
n(n \le 2 \cdot 10^5) 的树,对于每个点i 找一个j \ne i 的点,最大化i \to j 路径上边权的平均数。
首先考虑序列上怎么做,其实就是 ABC341G。经典的套路是,把平均数的除法看作前缀和除以长度的斜率,于是只需要建出凸包。
问题搬到树上,我们边分治并对一边建凸包,回答另一侧的询问即可。注意查询的时候由于没有单调性,需要一次额外二分斜率。复杂度两个
Day 2
E Harmony \color{green}\checkmark
有
n 个物品和m 种颜色(n,m \le 10^5 ),每个物品有属性a_i,b_i,c_i ,分别是价值、颜色和价格。对于每个物品,你都可以花费c_i 的价格将其颜色b_i 修改为任意颜色。你需要回答q(q \le 10^5) 个询问,每个询问形如:在总价格不超过x_i 的情况下,每个颜色的最大价值的最小值是多少?
考虑单组询问怎么做:显然可以二分答案
注意到可能的答案只有
F Farthest \color{green}\checkmark
给定数组
a(n \le 2 \cdot 10^5) ,一些部分变成了-1 ,你需要将他它们补成1 \sim n 的元素。定义一个数组是好的,当且仅当存在一棵无权树,满足距离点i 的最远点是a_i 。求有多少种填法满足数组a 是好的,模998244353 。
首先考察序列
- 当
n \ge 2 时,每个点的最远点显然不是它自己。也就是说,a_i \ne i 。 - 到达的最远的点一定是叶子。如果图有
k 个叶子,那么a 里面最多出现k 种颜色。
我们贪心的希望
不妨忽略颜色的限制,只管第一条限制。那么此时的答案显然是
注意到满足第一条且不满足第二条的序列
G Worst Town \color{red}\times
- 交互题。交互库有一张
n 个点m 条边的无向图(n \le 200,m \le 300 ),你只知道n 的值而不知道m 的值和图的形态。- 你每次询问可以给出一个点集,交互库告诉你这个点集是都是一个独立集。你做多可以询问
3200 次,你需要还原原图的每一条边。- 有一些有启发性的部分分:
- Sub 2:图是二分图,且左部点是所有奇数。
- Sub 3:对于任意三个点
a,b,c ,如果a,b 两点有边,b,c 两个点没有边,则a,c 两个点之间一定有边。
很牛的题啊!
首先 Sub 2 是很送分的,由于所有左部点内部没有边,考虑对于每一个右部的点
考虑 Sub 3 的神秘限制,这个神秘的条件说的其实是,图是一张完全
那么这个 subtask 的做法也很简单,直接动态加点维护每个独立集,暴力将新点加入。注意到加入一个点加不进去某个独立集一定是因为一条边,故
那么其实原题的做法已经差不多清楚了,我们延续 Sub 3 的思路,仍然将图划分为若干个独立集,对两两独立集之间暴力二分。询问次数即为
Day 3
A Moving Piece \color{green}\checkmark
给定
2n+1(n \le 300) 大小的方阵a ,在(i,j) 放置障碍物的代价是a_{i,j} 。求最小的代价使得(1,n+1) 和(2n+1,n) 两点不连通,不能再这两个点上放障碍。
比较经典的最小割转最短路建模。
左侧建超级原点连向左半边的边缘,网格八连通连边,右半边边缘连向超级汇点。显然任意一条源点到汇点之间的路径都会把目标点割开,故源汇之间的最短路即为答案。
B Chmax \color{green}\checkmark
给定序列
a,b(n,m \le 3000) ,你需要对序列a 执行m 次操作,第i 次操作可以选择一个j \in [1,n] 并令a_j \gets \max(a_j,b_i) 。问最后可以得到多少个不同的a 数组,对998244353 取模。
首先注意到
- 升序排序后,操作相当于推平。
- 降序排序后,一旦一个位置被操作过就不可能再被操作。
不妨先考虑
相同的值可能导致算重,因此我们按值域考虑。考虑设
考虑没有了
corner case 比较多,傻逼。
C Permutation of Length 26 \color{green}\checkmark
给定字符串
s(n \le 10^5) ,首先你需要任意选择一个子串s[l,r] 并令s \gets s[l,r] ,然后选择一个1 \sim 26 的排列p ,同时将串中所有字符i 替换为字符p_i 。求s 字典序的最大值。
首先由于要求的字典序最大,我们选择的肯定是一个后缀。那么有了暴力
我们希望快速比较两个后缀
- 快速找到 LCP。
- 快速知道某一位的值。
考察我们这个贪心的流程:
- 如果这个字符没有出现过,赋值为还没使用过的最大字符。
- 否则,该字符的新字符已经确定。
那么快速确定每个字母的值是比较简单的:将所有字母在这个后缀以后的第一次出现位置倒序排序即可。
注意到一个位置的字符和其前驱的位置强相关,如果我们将小于后缀开头的位置都设为
有了这个观察,我们可以线段树动态维护序列
复杂度视实现可以做到
D Yet Another Balls and Boxes Problem \color{red} \times
给定数组
a(n \le 2 \cdot 10^5,a_i \le 10^5) ,一次操作是选择x,y 满足a_x \ge a_y ,同时令a_x \gets a_x - a_y,a_y \gets 2a_y 。用不超过2 \cdot 10^6 次操作使得数组里只剩下一个元素,或报告无解。
最理想的情况是,数组是
考虑能够借鉴上面倍增的思想,每次合并两个奇数,操作后一定会得到两个偶数。如果恰好有偶数个奇数,则两两合并后全都会变成偶数;否则总和一定是奇数。
如果每次合并都有偶数个奇数,那么合到最后立刻结束。否则我们断言直接无解。考虑一个奇素数
- 某模拟赛加强了这题:可以留下两个数字。
- 注意到把每一轮多出的那个奇数留下来,最后会剩下一个有
\mathcal O(\log n) 个数字的互不相同序列。- 考虑选出三个数字
a < b < c ,我们通过操作实现b \gets b \bmod a ,并不断迭代直到最小值等于0 。
- 注意到
b \bmod a = b - a \lfloor \frac{b}{a} \rfloor ,记t = \lfloor \frac{b}{a} \rfloor ,考虑类似快速幂的,每次给a 乘2 ,如果第i 位是1 就给b \gets b - a ,否则去对c 操作。- 操作完后,
a 会翻t 倍,c 会变小,b 会变成一个[0,a-1] 之内的数字。- 我不清楚怎么严谨的分析操作次数,但是看起来最小值大概是除以
2 了的。迭代一次的轮数可以看作\mathcal O(\log n) ,故操作数量为\mathcal O(\log^3 n) 。
E Output-Only \color{green}\checkmark
构造两个长度为
10^5 的正整数序列,满足\forall i \in [1,2 \cdot 10^6] ,都存在x,y 满足a_x \cdot b_y = i 。
非常搞笑的题。
首先所有质数肯定要存在在序列里,打表发现
直接把
I Prefix Or \color{green}\checkmark
给定序列
a(n,a_i \le 2\cdot 10^5) ,重排使得其所有前缀的或和之和最小。
看完题立刻写贪心:每次找最小的或和,只有
考虑以下数据:
4
4 4 4 3
注意到
我想了很久也没能设计出一个合理的贪心策略,注意到值域不大,考虑 DP。
设当前最后一个位置的或和是
有 DP 式子:
考虑对其进行放缩,去掉只可以或上
可以直接枚举子集做到
J Balanced Permutation \color{green}\checkmark
给定长为
n(n \le \textbf{5000}) 的排列a ,有些位置还没有填。补全排列a 以最小化\max|ip_i - jp_j| 的值。
不要被数据范围骗了。
想了很久也想不出来贪心从大往小填哪里不对,写了一发
与上面那个题形成鲜明对比。
2021
Day 2
I Multiple Swap \color{green}\checkmark
给定两个长
n-1(n \le 5 \cdot 10^{\textbf 4}) 的数组a,b ,一次操作你可以选择两个位置i,j 满足j 是i 的倍数并交换a_i,a_j 。在10^6 次操作内将a 变成b ,或报告无解。
大水题,不知道咋 2k8 的。
首先我们可以根据
有一个直观的交换方法是,
注意到大于
否则,每个数字的最小质因子必然不超过
J Min-Max Sequence \color{green}\checkmark
给定
n,m(n,m \le 2 \cdot 10^5) 和长n 的序列a,b ,你需要计数满足下面条件的值域[1,m] 的序列c ,对998244353 取模:
- 条件:如果
a_i = 0 则\min(b_i,b_{i+1}) = c_i ;如果a_i = 1 则\max(b_i,b_{i+1}) = c_i 。
直接设
可以直接上线段树优化。
更优美的做法是,
K Bracket Inserting \color{green}\checkmark
你有一个空的字符串
s ,一次操作可以在任意位置插入相邻的一对括号(即,s = s[1,i] + \texttt{()} + s[i+1,n] )。问n 次操作后得到t 的方案数,模998244353 。
把每次插入一对括号的过程倒过来看作每次删除一对括号,容易发现删除顺序本质上是括号树的拓扑序。
有根树的拓扑序计数是经典问题,考察每个点作为子树最小值的概率,故答案是
L ジグザグ道 \color{green}\checkmark
给定
n 个点m 个点的图(n,m \le 10^5 ),边带互不相同的权。求一条1\to n 的路径,满足路径上的边权c_1,c_2,\ldots,c_k 满足(c_i-c_{i-1})(c_{i+1}-c_i)<0 。
考虑如果只需要严格递增怎么做:可以对每个点拆入点和出点,然后做前后缀优化建图。
现在需要先增后减,那么不妨额外记一个
M Deque and Inversions \color{red}\times
- 定义一个排列
p 的权值是,执行以下操作后q 的逆序对的最小值:
- 初始时
q 为空。- 对于
i = 1,2,3,\ldots,n ,你可以选择将p_i 放在q 的开头和结尾。- 求所有
n! 个排列p 的权值之和。
首先对题目做第一步转化,注意到不管把
一个很重要的观察:设
N Polynomial Comparison \color{green}\checkmark
给你两个多项式
f(x),g(x)(n,m \le 2 \cdot 10^5) ,问x = k 时f(x),g(x) 的大小关系。
首先先给
O Golf \color{green}\checkmark
给定一个字符串
s(n \le 2 \cdot 10^5) ,定义一个字符串t 是好的,当且仅当t 在s 中出现了恰好一次。q(q \le 2 \cdot 10^5) 次询问,每次询问给出l,r ,查询最小的len 满足存在一个x \le l,x + len - 1 \ge r 且s[x,x+len-1] 是好的。
固定起点时,好的字符串长度有单调性。我们首先用后缀数组求出
然后就变成了一个线段树扫描线问题,直接维护即可。
Day 3
E お菓子 \color{green}\checkmark
E お菓子 \color{red}\times
给定一个序列
a(n \le 1 \cdot 10^5) ,q(q \le 1 \cdot 10^5) 次操作,支持单点修改,查询有多少个区间的\text{lcm} = x 。
有一个比较简单的
但是注意到一个性质:包含位置
F ワープ \color{green}\checkmark
- 给定一条
1 \to n 的链和m 个点对(u_i,v_i) ,q 次询问问如果加一条边x,y ,m 对点的最短路之和。询问之间独立。
垃圾题,根据