构造题 & 交互题
- 不必最优化的题目加入一些更严的限制会更好做 【1,4,5】
- 递归思想 or 将大问题分解成小问题拼接起来【6】
- \(A\to B\Leftrightarrow A\to C\to B\Leftrightarrow A\to C(C\to A),B\to C(C\to B)\)【2,3】
- 正难则反,特别是后面限制严格强于前面的【8】
- 只要多种方案中有一种可行即可,分讨 or 鸽巢原理;或者先用最简单的方案将规模缩小后用简单的方法(如直接暴力)解决【1,10】
可以求解出一个比较好求的、包含原问题的解,输出一部分【12】 - 斐波那契表示法 【7】
- 若所有数可以整体偏移,不妨假定第一个为有优秀性质的数【11】
- 质数在取模不重复上有良好的性质【12】
- \(a\) 与 \(b\) 二进制下相差 \(k\) 位 \(\Leftrightarrow\) \(a\operatorname{xor}c=b\),其中 \(c\) 二进制下 \(1\) 的个数为 \(k\)【11】
-
[AGC066A] Adjacent Difference 加入限制:修改后的 \(a_{i,j}\) 必须是 \(d\) 的倍数,因此可以想到相邻的一个改成奇数倍一个改成偶数倍,两种改法代价和是 \(dn^2\),则必有一个不超过 \(\frac{1}{2}dn^2\)。record。
-
\(\color{red}\star\) P10887 【MX-S3-T3】「FeOI Round 1」再演 冥思苦想很久发现跟题解都不一样!发现当 \(res=n+1\) 时,必须是 \(\le n\) 的和 \(>n\) 的一一搭配,可以不断交换 \(1\) 和 \(>n\) 的得到两两配对情况;从一开始的局面到 \(res=n+1\)(最后倒回去),其实只需要不断拆散 \(\le n\) 的两两配对,于是不断交换 \(n+1\to 2n\) 和 \(res\) 即可。
构造 \(res=n+1\) 的过程最多只要 \(n-1\) 次,后面的询问 \(n-1\) 次后另一组也随之确定,剩下的 \(1\) 次是前面取到 \(n-1\),此时前一次的 \(res\) 肯定和 \(2n\) 在一组,后面又可以省掉一次。注意特判 \(n=1\)。record。 -
CF778D Parquet Re-laying 玩一玩可以发现对于目标一定可以到全部横着,具体方案是从左往右从上到下依次做,每次不断往右下角找一个可以转的,而横的到目标只要再做一遍目标到横着的然后逆转操作序列。record。
-
[ARC152D] Halftree 挺正常的一个构造题。偶数显然无解;\(+k\) 其实就是将连边划分为 \(\gcd(k,n)\) 组、每组 \(\frac{n}{\gcd(k,n)}\) 个点,\(n\) 为奇数因此组数和每组个数都是奇数,一组组看随便玩一下就出来了。record。
-
\(\color{red}\star\) [ARC145D] Non Arithmetic Progression Set 每一步都在我意想不到的地方。化简一下限制:\(x-y\ne y-z\Leftrightarrow x+z\ne 2y\),二进制玩不出来就改三进制!发现每一位如果都是 \(0,1\) 的话一定可以满足(因为 \(x,z\) 至少有一位不同)。
同时,所有数任意加 or 减一个数都不变,因此先将 \(a_i\) 赋值为将 \(i\) 二进制分解完当成三进制的值并偏移一位将最后一位留空,紧接着直接减小差距在 \(n\) 以内,通过改变最后一位凑出和。record。 -
[AGC041C] Domino Quality \(n=1,2\) 无解,\(n=3\) 容易构造但没什么用,手玩一下发现 \(n=4,5,6,7\) 都可以构造出每行每列个数为 \(3\) 的情况,于是按 \(\bmod 4\) 余数将若干个 \(n=4\) 和另一个矩阵沿对角线拼起来。record。
-
[ARC122C] Calculator 感觉很早以前模拟赛打过这题自以为做出来了结果挂惨了。给的形式就很像斐波那契,于是考虑将 \(n\) 划分成几个斐波那契的和,在相应位置时加 \(1\),注意操作的奇偶性。record。
-
[ARC122E] Increasing LCMs 由于前面的数可能会影响后面的,但与具体的顺序无关,因此很难不倒序考虑。事实上,倒序考虑随便选一个合法的就行了,因为后面的限制严格强于前面。求 \(\operatorname{lcm}\) 会溢出,所以可以直接求 \(\prod \gcd\) 与 \(x\) 比较。record。
-
CF1922E Increasing Subsequences 最自然的想法是二进制拆分成几个单增的序列,但大约是在 \((\log X)^2\) 级别的,把相同长度的前缀合并在一起即可,长度大约是 \(2\log X\)。record。
-
CF1909E Multiple Lamps 诈骗题。最简单的就是全部按一遍,剩下的个数是有平方因子的数的个数。事实上,这一数量在 \(n\ge 20\) 时均小于 \(\lfloor\frac{n}{5}\rfloor\)。只用考虑 \(n<20\) 时的情况,预处理出可能的按钮序列暴力判断即可。
record。 -
ARC138D Differ by K bits 相差 \(k\) 位相当于异或上一个 \(1\) 的个数为 \(k\) 的数,钦定 \(a_1=0\),爆搜即可(跑不满)。
-
\(\color{red}{\star}\) ARC140E Not Equal Rectangle \(n,m\) 范围大概是值域的平方,而质数一般有 \(\bmod\) 不相同的特点,因此选择 \(n=m=23^2\),并从中截取下来一块。然后是神秘构造。咕。
-
P11190 「KDOI-10」反回文串 部分分提示分两种情况:众数出现次数 \(cnt\) 大于一半/小于一半。小于一半:答案为 \(\lfloor{\frac{n}{2}}\rfloor\)。类似摩尔投票那样贪心地每次选出现次数最多的两个即可。
麻烦的在大于。先特判:若 \(cnt=n\) 则无解;若 \(cnt=n-1\),此时若整个串是一个回文串无解,否则答案为 \(1\)。易证答案最优为 \(n-cnt\)。设 \(l,r\) 为非众数的第一个和最后一个出现的位置,\([l,r]\) 均为非众数且 \(l=1\) 或 \(r=n\) 是简单的。否则由于懒不想再推一遍,只能说是很臭长的构造方法,多试试就出来了。
其他的一些思维题 & 数学题
- 时间倒流【7】
- 对于一些奇怪的条件,可以通过换项、同时加减等变得“工整”后再分析【3】
- 数形结合(折线法)【2,6】
- \([l,r]\) 为 \(x\) 倍数 \(\Leftrightarrow s_r\equiv s_{l-1}\pmod x\),类似消消乐【8】
- 平方数等可以先把满足条件的挑出来,卡不过不断调整上界【12】
- \(n\) 个限制 \(n\) 个变量,考虑用一些特别的方法/别的约束求解【9】
-
[ARC152B] Pass on Path 猜测在同一个休息站出发。证明:若第一次相遇在位置为 \(x\) 的休息站,则第二次相遇在长度为 \(L-x\) 的休息站,初始在同一个休息站出发则可以看做第一次相遇,一定最优。record。
-
\(\color{red}{\star}\) [ARC152C] Pivot 妙!由于反转后最大值和最小值的差不会变,所以仅需使最小值最小。同时,操作 \(i\) 相当于在数轴上把以 \(a_i\) 为轴翻转,点的相对,分布不变,此时最小值由 \(a_1\to 2a_i-a_n\),变化值 \(b_i=2a_i-a_n-a_1\)。
这个 \(b_i\) 的贡献是正还是负,事实上可以随便取,因为若当前操作贡献正负不是预期的,就可以不断操作同一个 \(a_i\) 改变,最后再根据情况将 \(a_i\) 正负更正即可。于是就转变成了求 \(b_{1\sim n}\) 的最大线性组合 \(x\) 使得 \(x<a_i\),根据裴蜀定理,设 \(d=|\gcd\{b_i\}|\),最小的 \(a_1\) 为 \(a_1\bmod d\),答案即为 \(a_1\bmod d+a_n-a_1\)。record。 -
CF1909D Split Plus K 一个很牛的转换:\(x+k=y+z\Leftrightarrow x-k=(y-k)+(z-k)\)。于是一开始把所有 \(a_i\) 都减去 \(k\),若符号不同则无解(需特判 \(0\)),否则答案为 \(\gcd(a_i)\)。record。
-
CF1359E Split Plus K 一个限制是:所有结果都等于 \(x\bmod a_1\),不难发现这个当且仅当 \(a_i\) 都是 \(a_1\) 的倍数时满足,于是枚举 \(a_1\) 用组合数算即可。record。
-
CF1334E Divisor Paths 由于是因子个数的差,走 \(x\to \gcd(x,y)\to y\) 一定是最优的,每次减少一个质因数,\(x\to \gcd(x,y)\),设 \(\frac{x}{\gcd(x,y)}=p_1^{\alpha_1}p_2^{\alpha_2}...p_r^{\alpha_r}\),则不难推得方案数为 \(\frac{(\sum \alpha_i)!}{\prod \alpha_i!}\),\(\gcd(x,y)\to y\) 同理,相乘即为答案。record。
-
CF1204E Natasha, Sasha and the Prefix Sums 枚举前缀最大值 \(i\),恰好不好做,换成求大于等于后容斥一下,于是等价于向右上或右下走碰到 \(y=i\)。若 \(n-m>i\) 显然随便走,否则按经典折线法做即可。record。
-
ARC138B 01 Generation
-
ARC129C Multiple of 7
-
\(\color{red}{\star}\) ARC129D -1+2-1
-
ABC374E Sensor Optimization Dilemma 2
-
CF134B Pairs of Numbers
-
「提高班 Day 5」平方数
动态规划
- 可以通过减少可行状态的方法优化复杂度【9】
- 有很多个限制的可以尝试找出最强的一个【1】
- 求 \(f_{i,j}\) 的最大值 \(k\) 可转换为 \(f_{i,k}\) 的 \(j\)(是否满足条件)【3】
- 通过特殊性质简化操作序列【23】
- 填数不一定要按位置填,之后插进去也行【18】
- 不同数字个数 \(\Leftrightarrow\) \(a_i\) 的贡献为 \([lst_{a_i}+1, a_i]\)【4】
- 拆分数的经典加加减减:
- 最前面加入一个 \(1\);全局加 \(1\);
- 初始为 \(0\),任意后缀加 \(1\);
- 初始为 \(n\),任意前缀减 \(1\);
- …… 【1】
- 第 \(i\) 个限制在 \([l_i,r_i]\) 的,可以直接把所有端点离散下来讨论【17】
- 交换可以转化为前缀/后缀和更改后进行 dp【6】
- 当答案状态不确定时,可以统计下一步到答案的可行状态的贡献【21,22】
- 类似楼房重建一类问题的线段树
pushup
【24】 - 从 \(n\) 个中取 \(m\) 个数,每个可以选满足某种条件或不选可以加入 \(m\) 个特殊的数作组合数【17】
- 不好记录状态却有限制的,如果数据规模小可以直接暴搜【19】
-
\(\color{red}{\star}\) [AGC041D] Problem Scores 前两个限制简单,着手在第三个限制,而第三个其实最强的就是前 \({\lfloor{\frac{n}{2}}\rfloor+1}\) 个数的和 \(a\) 大于后 \({\lfloor{\frac{n}{2}}\rfloor}\) 个数的和 \(b\)。维护 \(\Delta=a-b\),拆分数常见的加加减减:初始全部设为 \(n\),\(\Delta=n\),每次把任意一个前缀都减少 \(1\),这样 \(\Delta\) 一定会减少,于是问题转化成了:有 \(n\) 个数,每个对应一个代价 \(w_i\),可取任意多个,求总代价不超过 \(n\) 的方案数,完全背包即可。record。
-
[AGC046B] Extension 不难的一道 dp。记 \(f_{i,j}\) 表示 \(i\) 行 \(j\) 列的方案数,基础转移时 \(f_{i-1,j}\times j+f_{i,j-1}\times i\),重复的部分是第 \(i\) 行在前 \(j-1\) 行且第 \(j\) 列黑点在前 \(i-1\) 行的情况,减去 \(f_{i-1,j-1}\times (i-1)\times (j-1)\) 即可。record。
-
P6223 [COCI2009 Final Exam#1] PODJELA 把钱数放到状态里面显然不现实,所以考虑经典转化:\(f_{i,j}\) 表示 \(i\) 子树内操作 \(j\) 次使除了 \(i\) 钱数都大于等于 \(0\) 时 \(i\) 拥有的最大钱数。于是枚举操作次数,若 \(f_{son,j}\) 大于等于 \(a_j\) 则不一定要给 \(i\),否则一定得给 \(i\)。record。
-
CF833B The Bakery \(f_{i,j}\) 表示前 \(i\) 个数划分为 \(j\) 段的最大价值,发现不同数字的个数的处理相当于 \(a_i\) 的贡献为 \([lst_{a_i}+1, i]\),于是枚举 \(j\),每次线段树区间加贡献、\(O(n\log n)\) 转移即可。record。
-
[ARC073F] Many Moves 赛时切的!题解。record。
-
\(\color{red}{\star}\) AGC046C Shift
-
ARC059F バイナリハック
-
P9745 「KDOI-06-S」树上异或
-
ABC374F Shipping
-
\(\color{red}{\star}\) ARC171C Swap on Tree
-
ARC107D Number of Multisets
-
P4302 [SCOI2003] 字符串折叠
-
P2051 [AHOI2009] 中国象棋
-
P3757 [CQOI2017] 老C的键盘
-
\(\color{red}{\star}\) P4099 [HEOI2013] SAO
-
P2339 [USACO04OPEN] Turning in Homework G
-
\(\color{red}{\star}\) P3643 [APIO2016] 划艇
-
[AT_tdpc_string] 文字列
-
P3262 [JLOI2015] 战争调度
-
P6116 [JOI 2019 Final] たのしいたのしいたのしい家庭菜園
-
CF908D New Year and Arbitrary Arrangement
-
CF1156F Card Bag
-
CF67C Sequence of Balls
-
楼房重建
数据结构
- 对应不同情况下的贡献,考虑统一形式【3】
- 树剖点转边是将边权放到儿子节点上,接下来查询时要把 \(LCA\) 扣掉【5】
-
P11021 「LAOI-6」区间测速 按 \(t\) 从小到大排序,
通过生活常识知道最快的一定是相邻两个时间点组成的时间段的平均速度,修改最多只会影响四段:修改位置相邻两段和目标位置相邻两段,先求出未修改前的全局前三大,修改时将包含 \(t_{u_i}\) 的最小值踢掉,并和改完后相邻两段的平均速度、原先左右两端合并平均速度取 \(\max\),具体操作用 set 实现,细节有点多。record。 -
\(\color{red}{\star}\) [AT_jag2017autumn_k] Conveyor Belt 咕。
-
P5797 [SEERC2019] Max or Min
-
P11158 【MX-X6-T4】夢重力
-
Qtree1
基础算法
- 贪心策略:将 \(i\) 变为/放入之前/后第一个可以放的,常用并查集维护【1】
- 对于某些看似无用的限制,满足单调性的可以二分【2】
- 看起来像来回反悔的贪心可以强制先一个再贪心【3】
-
P6155 修改 交换 \(b\) 其实是总次数一定的情况下,多的尽量多。于是从后往前枚举 \(i\),若有重复则将 \(a_i\) 变为之后第一个未出现过的,可以用并查集来维护。
-
P11188 「KDOI-10」商店砍价
-
「2024-02-15 南外模拟赛」弱化的杨表
图论
- 判断是否可以变到目标局面,可以对操作顺序等进行限制判断是否可行【4】
- 给 A 赋值要求满足 B,可以转化为用 B 对 A 进行限制【5】
- 拆点【12】
- 差分约束不一定是最短路,最长路也可以【6】
- \(a\le bc\Leftrightarrow \log_{k}(a)\le log_k{b}+log_k{c}\)【8】
- 判断 \(z\) 是否在 \(x, y\) 的路径上相当于判断 \(dis(x, z)+dis(y, z)\) 等不等于 \(dis(x, y)\),也相当于判断 \(LCA(x,y,z)=LCA(x,y)\&\&(LCA(x,z)=x||LCA(y,z)=y)\),反之亦成立【15】
- 求可以走进环的点,不用缩点,可以直接建反边拓扑【9】
- 对于总贡献为每个点的深度乘 \(w_i\) 的可以对于所有子树把字数内 \(w_i\) 加起来【14】
- 同余最短路【7】
- 头尾相同可以连边或类似的,不用两两遍历,可以头字符向尾字符连边,把点转换为边【10】
- 网络流题目可以通过最大贡献减损失转换为最小割【15】
- 对于环等特殊图的要求,可以从出度、入度的角度考虑【13】
- 找环的时候,可以根据具体情况判断在遍历前/后判断【11】
- 笛卡尔树 \(i\) 的子树为可以拓展最远的、无大于(小于)其权值的数 【14】
-
\(\color{red}{\star}\) ARC107F Sum of Abs
-
P4768 [NOI2018] 归程
-
ABC270F Transportation
-
\(\color{red}{\star}\) AGC027F Grafting
-
\(\color{red}{\star}\) P5590 赛车游戏
-
P3275 [SCOI2011] 糖果
-
P3403 跳楼机
-
P4926 [1007] 倍杀测量者
-
P3436 [POI2006] PRO-Professor Szu
-
P1127 词链
-
P3520 [POI2011] SMI-Garbage
-
P1251 餐巾计划问题
-
「提高班 Day 3」强连通分类
-
丘岩岩萨满
-
[TJOI2008] 通讯网破坏
-
P4313 文理分科
字符串
- 不同子串个数等于总数减去相邻前缀的公共前缀大小【1】
- 不同子串个数
其他
- 根号分治【1】
- 高维前缀和【2】
-
P3591 [POI2015] ODW
-
CF165E Compatible Numbers