9.1-9.6 学习记录
9.1
完善了部分训练策略。
能力提升综合题单 Part 1.1 - 1.2,比较有价值的题目:
- P1980 计数问题:按位考虑数位贡献。
- P1014 Cantor 表:对角线分组,副对角线和相同,奇偶讨论。
- P1047 校门外的树:区修想差分。
9.2
能力全面提升综合题单 Part 1.3 - 1.4
- P1012 拼数:拼数比较法求最大整数。 $A+B > B+A$,这构成严格偏序。
- P2010 回文日期:枚举部分,构造另一部分,判断合法性。
- P1028 数的计算:序列计数问题,使用结尾元素来代表一个序列。常见有:长度、开头元素、结尾元素。
- P4994 终于结束的起点:Fibonacci 数列模 $M$ 意义下的周期性,可以用 $\pi(M)$ 描述,$\pi(M) \le 6M$。
思维训练:
AT_arc111_c
题意:构造题,求最小交换次数和方案,使得每个人拿到对应的行李。若超重,则无法交换。
失败的思考路径:
- 构造题,考虑无解的情况。猜测结论,满足充分性但不会证明必要性,遂作罢。
- 数据范围提示排序,排了之后也不会。
正确的思考路径:
- 通过交换实现排列归位,是置换环的经典应用。直接图论建模。
- 考虑下界。如果没有约束,最少也需要交换 $n -$ 环数 次交换。
- 考虑通过构造达到下界。每一个环内,找到体重最大的那个点 $i$,使其与它的前继交换,这样会使得前继归位。非法的情况当且仅当最大体重无法接受交换前,前继的背包重,但这样就无法交换了,因此,只要交换成功,就不会出现非法。
- 非法情况只存在于无法交换的情况中,即非自环的环上,存在 $b_i \ge a_i$。
9.3
能力全面提升综合题单 Part 2.2 - 2.4
- P1309 瑞士轮:全局排序的一种优化–>归并合并两个有序序列,可拓展至 $k$ 路归并。
- P1902 刺杀大使:最大值最小可以用二分答案做。但这题同时也是瓶颈路,需要想到 MST,不断地添加边(两点边权是 $\max$ 两点点权),直到第 $n$ 行的点都可以和第 $1$ 行的点连通。时间复杂度 $O(n^2 \log n^2)$。
- P1314 聪明的质检员:关注 $f$ 函数则有单调性,且是求数值,考虑二分;关注差值函数则是单峰函数,考虑三分求单峰函数极值。
- P1083 借教室:区修区查可以线段树做。注意到答案函数是单调 $01$ 函数,考虑二分。
- P1429 平面最近点对:分治经典题,按 $x$ 分左右,答案要么左、要么右、要么跨左右。将二维问题固定一维,变成区间问题,神似线段树。
思维训练
AT_arc106_d
题意:对于 $x\in[1,k]$,分别求 $\left(\sum_{L=1}^{N-1} \sum_{R=L+1}^{N} (A_L + A_R)^X\right) \bmod 998244353$。
错误的思考:
-
计数题,这题的大方向肯定是转化计数对象,考虑 $A_i$ 的贡献,或者值域的贡献?($2\times 10^8$)。
-
这个 $x$ 提示我们需要递推,先确定 $x=1$ 的边界情况。
-
考虑 $x=1$,此时 $A_i$ 贡献了 $(n-i)+(i-1)=n-1$ 次。
-
考虑递推。从 $A_i$ 的角度看贡献,首先把二项式拆开。
$(A_L+A_R)^x = {x \choose 0} A_L^x A_R^0+ {x-1 \choose 1} A_L^{x-1}A_R^1 …$
由于 $x \le 300$,所以我们可以考虑每一个 $A_L^i$ 的贡献次数。
-
从 $x=1$ 得到启发,$A_i^{j}$ 的贡献可分为 $L,R$ 两类:
- $i$ 作为 $L$ 时
- 原:$\sum_{k \in [i+1,n]} {j \choose x-j} A_i^jA_k^{x-j}$
- 现:$\sum_{k \in [i+1,n]} {j \choose x+1-j} A_i^jA_k^{x+1-j}$
- $\Delta = $
- $i$ 作为 $R$ 时
- 原:$\sum_{x\in [1,i-1]} {x-j \choose j} A_x^{x-j}A_i^j$
- 现:$\sum_{x\in [1,i-1]} {x+1-j \choose j} A_{x+1}^{x+1-j}A_i^j$
- $i$ 作为 $L$ 时
正确的思路:
-
推式子题,先推式子。
-
对于这种无序数对的题目,通常转化为有序数对会好做,于是我们定义:
$T_x = \sum\limits_{l=1}^n \sum\limits_{r=1}^n (a_l+a_r)^x$.
-
考虑 $T_x$ 与答案之间的关系。按照下标间的大小关系,可以将 $T_x$ 划分成 $3$ 类:$l<r,l=r,l>r$。其中,$l<r$ 的部分和 $l>r$ 的部分是对称的,且答案是 $l<r$ 的部分。
-
于是有:$ans_x = \frac{T_x-\sum\limits_{i=1}^n(2a_i)^x}{2}$
-
分开考虑,$T_x = \sum\limits_{l=1}^n \sum\limits_{r=1}^n\sum\limits_{k=0}^x{x \choose k} a_l^{x-k}a_r^k$
提前和式:$T_x = \sum\limits_{k=0}^x \sum\limits_{l=1}^n \sum\limits_{r=1}^n {x \choose k} a_l^{x-k}a_r^k$
提前变量:$T_x = \sum\limits_{k=0}^x {x \choose k}\sum\limits_{l=1}^n \sum\limits_{r=1}^n a_l^{x-k}a_r^k$
分离变量:$T_x = \sum\limits_{k=0}^x {x \choose k} (\sum\limits_{l=1}^n a_l^{x-k}) (\sum\limits_{r=1}^n a_r^k)$
-
分开考虑,$\sum\limits_{i=1}^n(2a_i)^x = 2^x \sum\limits_{i=1}^n a_i^x$
-
预处理 $\sum\limits_{i=1}^n a_i^x$ 就可以了。
9.4
能力全面提升综合题单 Part 2.5
- P4995 跳跳:排序贪心,归纳法+交换论证好题。
- P1199 三国游戏:博弈题,自己玩一下就懂了。
- P2672 推销员:双关键字排序中,按其中一个关键字排序的类型。
- 题意: 对 $x\in[1,n],\lvert C \rvert = x$ 求 $2 \times \max_{i \in C} S_i + \sum_{i \in C} A_i$ 的最大值。
- 思考:
- 分析点贡献。要么贡献 $A_i$,要么贡献 $2S_i+A_i$。
- 双关键字贪心,考虑给其中一个关键字排序。按 $S$ 排序不行,按 $A$ 排序。
- 此时最优解分两种情况,取 $\max$ 即可。
- 前 $X$ 个全选。
- 在 $[X+1,n]$ 找一个 $j$ 替换 $X$。可以证明只需要找一个,因为找两个的话,让不是最大值的那个不换,结果一定不劣。
- P1080 国王游戏:序列上交换相邻两项只影响相邻两项,考虑临项交换法确定排序规则。
- P2123 皇后游戏:邻项交换得到的排序规则不满足严格弱序,先分组,再排序。
9.5
思维训练
AT_arc129_d
题目描述
给定一个长度为 $N$ 的整数序列 $A=(A_1,A_2,\cdots,A_N)$。
你可以任意次数重复以下操作:
- 选择一个整数 $i$($1 \leq i \leq N$),并分别对 $A_{i-1},A_i,A_{i+1}$ 加上 $-1,2,-1$。这里,$A_0$ 视为 $A_N$,$A_{N+1}$ 视为 $A_1$。
请判断是否可以将 $A$ 的所有元素都变为 $0$,如果可以,请求出所需的最小操作次数。
思路
- 做过类似的 ICPC 题。首先注意到操作不会改变 $sum$,这个用来判无解。
- 考虑线性 DP,值域很小,$f[i][j]$ 表示前 $i-1$ 项都是 $0$,第 $i$ 项等于 $j$ 的最小操作次数。
- 简化约束。若没有环约束如何转移?
- 枚举上一个数的取值,$dp[i][a[i] +2j] = dp[i-1][j]+j$
- 考虑处理环形:
- 扩环成链:不行
- 规定起点位置:不行
- 尝试摸性质。考虑下界。
- 对于 $a_i<0$ 的点,至少需要在它身上进行 $\frac{-a_i+1}{2}$ 次操作。
- 每一轮将 $<0$ 的点提升,至多进行多少轮?肯定是不多的,直接暴力吗,这样是最优的吗?
9.6
VP CF 1117 Div.2
A
题意
定义 句子缩写 为单词首字母大写后相连,求用 $n$ 个单词,能否恰好构成 $m$ 个缩写,顺序不限。
$n,m \le 100$,$\sum$ 字符长度 $\le 5 \times 10^4$
思考
- 剔除无用元素,只有首字母有用。
- 切换视角,$\mathit{cnt}[i]$ 表示 $i$ 这个字符开头的单词有多少个,判断能否构成某个缩写,实际上就是判断缩写的每一位出现次数是否小于等于 $\mathit{cnt}[$ 这一位 $]$,之后再将 $\mathit{cnt}[$ 缩写开头 $] \mathrel{+}= 1$。
- 一个暴力的做法,能拼出的就拼出,重复 $m$ 轮。时间复杂度好像对。
- 做法假了,因为如果某一位不够,随便找一个以这一位开头的单词,让它形成缩写,就可以让这一位增加。
- 因此只有某一位不存在的情况,才会使得这个缩写不能被拼出。无解的情况就是缩写用到了一个没出现过的字符(令某一位从 $0 \to 1$ 的唯一方法是找一个以这一位为开头的缩写,但是这样的缩写一定不能被拼出)。
- 用时 $37$ 分钟(
B
题意
两个人 $A$,$B$ 在博弈,各自有一个非严格递减序列 $a,b$。初始时都站在第 $1$ 项上。
每一轮里,若 $A$ 前面的项 $>$ 当前项,移动一项;$A$ 当前项 $-1$。$B$ 同理。
若 $A$ 到达了最后一项,且这一位的数值 $= 0$,则 $A$ 失败。
$A$ 先手。问谁赢。
思考
- 博弈题,但是不会产生决策,所以实际上是模拟题。
- 计算每个人能撑过几个 $-1$ 即可。
- 用时 $18$ 分钟
C
题意
以 $1$ 为根的有根树有 $n$ 个节点。给定点集 $A$ (大小为 $m$) 和边集 $C$,要求对于任意两个点 $x,y \in A$,都有 $\operatorname{Path}(1,x),\operatorname{Path}(1,y)$ 与边集 $C$ 的交集不同。
求最小边数并输出边集 $C$。
$m \le n \le 10^5$
赛时思路
- 构造题,先考虑下界。对于任意两个点 $x,y \in A$,令 $p = \operatorname{lca}(x,y)$,则 $\operatorname{Path}(p,x),\operatorname{Path}(p,y)$ 上至少有 $1$ 条边集上的边。这里着急了,直接去构造最优解了,没有真的考虑下界是 $m$。
- 树上问题,先从点的角度看。
- 把 $\operatorname{Path}(1,x)$ 视作序列,则问题转化为:$k$ 个序列,选定一些项,使得序列之间两两不同。$1$ 个项可以区分两类点。一类是在这条边下面的,另一类是外面的。
- 想象这个过程,一开始是一团,选了一个项之后,裂成两团,再选,再裂。
- 没啥想法了。
- 再从边的角度看。
- 一条边能区分可以区分两类点。一类是在这条边下面的,另一类是外面的。因此至少需要 $\log m$ 次操作。能否达到这个下界呢?样例好像佐证了这点,尝试构造!
- 事实是无法达到下界,失败了。
- 用时 $31$ 分钟。
正确思路
- 构造题考虑下界。在每个点上方选边显然能成,用掉 $m$ 条边。
- 发现有一个点可以没有边标记,最优做到 $m-1$。因为一条边只能区分一个连通块内的两类点,相当于每次将连通块个数 $+1$,最终要形成 $m$ 个块,最少就是 $m-1$ 条边。
D
题意
目标矩形的面积是 $S$,边长是正整数。处理 $q$ 次查询,问 $(\le x,\le y)$ 内有多少个可能是目标矩形的点。
$S \le 10^{14}, q \le 3 \times 10^5$
赛时思路
- 几何理解一下目标矩形的覆盖范围,是对称的,数据范围暗示了与 $\sqrt{S}$ 有关。到这里都是对的。
- 查询可以离线,数据范围暗示排序。这里就没有发现可以枚举所有矩形,所以想歪了。
- 尝试先按 $x$ 排序询问。没啥用啊。
- 按 $y$ 排序。对称的,也没用。
- 多出来的 $\log$ 是在暗示神秘分治吗。
- 没思路了,用时 $17$ 分钟。
正确思路
- 直接枚举每个矩形($W_i \times H_i$),考虑每个矩形的贡献就可以了。
- 逐步添加约束
- 倘若 $x$,$y$ 无限大,每个矩形贡献 $(W_i - W_{i-1}) \times H_i$
- 加入 $x$ 约束,找到第一个 $W_i \ge x$,前面的前缀和加上,当前这一个贡献 $(x - W_{i-1}) \times H_i$
- 加入 $y$ 约束,找到最后一个 $H_j \ge y$,$[j+1,i-1]$ 范围内前缀和做,$[1,j]$ 范围内贡献 $y$,$i$ 贡献 $(x - W_{i-1}) \times \min(y,H_i)$
VP CF 1118 Div.2
A
题意
长度为 $n$ 的序列,每一次操作可以选择 $2k+1 \ (1 \le k)$ 个递增下标,删除其中第 $k+1$ 个下标。
求最终序列 $\gcd$ 的最大值。
思考
- $\gcd$ 只会越来越小,所以删除的数越多越好。
- 本质上我可以删除除了第 $1$ 项和第 $n$ 项之外的所有项,通过 $k=1$。
- $\gcd(a_1,a_n)$ 就是答案。
- 用时 $14$ 分钟。
B
题意
长度为 $n$ 的数组 $a$,每次操作选择一些 $\ge x$ 的项,将其裂成 $x$ 和 $a_i-x$ 这两项。
进行 $k$ 次操作,最大化某个相同项的个数。
$n,m,a_i \le 2 \times 10^5$
Eazy version 的赛时思路
- 值域很小,枚举值 $i$。
- 用 $x=i$ 操作,新增个数是大于 $x$ 的项的个数,和等于 $2x$ 的项的个数。
- 用 $x=k$ 操作,新增个数是 $a_j - k = i$ 的项的个数,即等于 $i+k$ 的个数。取后缀最大值即可。想到这里就直接去写代码了,不应该这么急,应该发现第二种情况一定劣于第一种,这也是后来 Hard version 没思路的原因。
- 用时 $18$ 分钟。
Hard version 的赛时思路
- 延续 Eazy version 的思路,枚举值 $i$
- 用 $x=i$ 操作 $q$ 次,大于等于 $x$ 的项贡献 $1$ 个,大于等于 $2x$ 的项贡献 $2$ 个。。。如果 Eazy version 想对了,这里继续想下去说不定可以想到解法
- 用 $x=y$ 操作 $q$ 次,等于 $i+y$ 的贡献 $1$,等于 $i+2y$ 的贡献 $1$。。。这个 $y$ 好像又有贡献,不太好弄啊。放弃了。
正确思路
- 枚举值域是正确的,但是要发现,用 $x=i$ 操作一定比 $x=y$ 更优。
- 考虑比 $i$ 大的数在数轴上形成一段,直观上,每次用 $2^px$ 切最多,$0\le p \le k-1$。(一分为二)
- 因此 $k$ 的有效取值其实很少,只用枚举 $k \le 20$ 的部分(样例也能看出来)。
- 考虑每个 $a_j$ 的贡献,当 $a_j \le i\times2^k$ 时,贡献 $\lfloor \frac{a_j}{i} \rfloor$ 块,当 $a_j > i\times 2^k$ 时,贡献 $2^k-1$ 块。
- $a_j > i\times 2^k$ 很好统计,枚举 $i$ 的倍数处理 $a_j \le i\times2^k$ 的贡献。
贪心专题训练
Destroyer Takahashi
题意
$n$ 个区间 $[l,r]$,$l,r \le 10^9$。你可以通过一次操作清除与 $[x,x+d-1]$ 有交的所有区间。问最小操作次数。
$n \le 2 \times 10^5$
思考
- 不难发现这是区间选点的 plus 版,区间选区间。
- 按右端点升序排序,若选择区间的右端点无法覆盖当前区间的左端点,则在当前区间的右端点选一个长度为 $d$ 的区间。
- 使用调整法证明:
- 在一个最优解的选择区间集合里,找到第一个不是以题目区间的右端点作为开头的选择区间。
- 若将当前选择区间右移会产生影响,则必然存在一个题目区间被当前区间唯一覆盖,且题目区间的右端点大于选择区间的左端点,此时令选择区间的左端点 $=$ 题目区间的右端点必然不劣。
Same Sum Blocks (Hard)
题意
长度为 $n$ 的序列里选尽可能多的区间,这几个区间不能相交,且区间和相等。
$n \le 1.5 \times 10^3, -10^5 \le a_i \le 10^5$
思考
- 子段和约束,感觉像是二分答案。
- 二分区间和:函数没啥性质
- 二分区间数:有单调性,跑个二维 DP?那二分就没用了啊。
- 考虑 DP。
- 定义:$f_{i,j}$ 表示,前 $i$ 项,最多有多少个区间和 $= j$ 的不重叠区间?
- 转移:$f_{i,j} = \max(f_{i-1,j},\ f_{k,j} + 1)$,要求 $s_i - s_k = j$ 也就是 $s_k = s_i - j$。
- 优化:
- 这个 DP 是有单调性的,用 $k$ 最大的那个转移就好了,用 $\text{map}$ 维护。
- 对于点 $i$,能够形成的不同区间和至多 $i$ 个。
- 用二维 $\text{map}$ 存 DP 避免爆空间。时间复杂度 $O(n^2 \log n)$ 可以通过。
- 好像理论正确?但这是贪心专题啊(逃
正确思路
- [疑惑] 神秘转化:将所有区间按照 区间和 分组,每一组内的问题转化为:最大不相交区间
- 取右端点最小的区间就好了。
Cleaning Shifts S
最小区间覆盖模板题,有两种做法。
- 贪心地选左端点小于等于 $R$ 的区间中,$r$ 最大的区间。$O(n \log n)$。
- [疑惑] 还有一种巧妙地做法是图论建模。将 $l-1$ 与 $r$ 连一条边权为 $1$ 的边,$i$ 与 $i-1$ 连一条边权为 $0$ 的边,跑 $01$ BFS,这样跑出来的 $\mathit{dis}_i$ 的意义就是,“覆盖 $[1,i]$,需要的区间数”。$O(n+T)$。
国旗计划
题意
长度为 $m$ 的圆,顺势针编号。有 $n$ 个区间,问,对于每一个区间,固定选择它后,最少区间覆盖。(注意 $[1,2]$ 和 $[3,4]$ 这两个区间没有覆盖 $[1,4]$)。
思考
- 环上区间覆盖,做过类似的题目,扩环成链后钦定起点倍增即可。
- 唯一的问题是这题的 $M$ 特别大,离散化一下就好了。
- 还有一个细节,就是这题跨越边界的区间也要扩环。