做题记录
做题记录
Year: 2021
12.19
1.CF1620E
tag:树形结构,并查集
point:看到合并且无分裂应想到用树表示,而不是直接莽高级数据结构
2.ABC232F
tag:状压DP,贪心
point:确定排列可以用状压做到 \(O(2^n)\);冒泡排序的交换次数是逆序对数量且已经最优
12.20
1.ABC232G
tag:最短路,建图方式和优化
point:建 \(O(n^2)\) 级别的边,想到线段树优化建图的同时,还应想到前缀和/差分优化建图
2.CF1620C
tag:模拟,从高到低每位确定
point:在可能会爆精度时,可以考虑化乘为除;动手写代码前先理好思路
3. CF1051F
tag:生成树,最短路
point:可以将一个连通图理解为一棵生成树加若干条边
4. CF1620F
tag:动态规划,状态优化
point:看似无法优化的DP可以尝试发掘性质来优化状态;布尔类型DP可以尝试用最后一维存状态
12.23
1.URAL1841
tag:数据结构,建图,最短路
point:一定记得该开 \(longlong\) 的地方开 \(longlong\),以后不要强行宏定义了!
2.AGC046D
tag:动态规划,计数
point:计数题应找到所有被计数的一类物品的规律;重复计数可以尝试强加适当限制解决
3.P3960
tag:动态开点线段树,树状数组二分,平衡树
points:
- 二维操作也许等价于若干个模式相同的一维操作;
- 可以考虑将题目中的问题或要求拆分或合并;
- 链表删除操作有些时候可以转化为维护 \(01\) 序列左数的第 \(k\) 个 \(1\) 的位置;
- 空间不够不要怕,因为也许可以动态开点。
12.24
1.AGC039E
tag:区间动态规划,计数,转移优化
points:
- 两两配对问题可以尝试从枚举与某个点配对的点入手;
- 优化复杂度可以尝试把不必要嵌套在一起的循环拆开枚举,亦可以用辅助数组
2.P6891
tag:动态规划,状态优化
point:没有头绪时可以尝试打表找规律
12.25
1.CF1615D
tag:二分图染色,异或运算的性质
point:\(a\oplus b=\sum\limits_i2^i((a_i+b_i)\mod 2)\),其中 \(a_i\) 为 \(a\) 的二进制第 \(i\) 位;位运算也不一定要拆位考虑
2.CF1615E
tag:博弈论,凸函数优化动态规划
points:
- 凸函数的 \(max+\) 卷积等于差分归并排序的前缀和(待证);
- 先后手不交替操作的博弈题的一种想法是先手会让后手的操作空间尽量小
12.26
1.ABC233F
tag:图论,生成树,构造
point:想清楚再下手,好的实现方式很重要
2.ABC233G
tag:多维动态规划
point:无从下手时可以将大概结构画下来,从而找性质
12.27
1.ARC132D
tag:数学,贪心/动态规划
points:
- 不要被复杂的题目吓到,相反题面越复杂反而越有入手点;
- 两个 \(01\) 串互相变换的最少交换相邻字符次数是 \(\sum\limits_i|p_i-q_i|\),其中 \(p_i,q_i\) 分别为两串第 \(i\) 个 \(1\) 的位置
2.ARC132F
tag:递归,容斥,卷积
point:
容斥不一定要枚举集合,也可以按位容斥,如:所有位满足某条件,
等价于第一位任意填,其他位满足条件,减去第一位不满足条件,其他位满足条件。
12.28
1.CF1076G
tag:博弈论,线段树维护线性变换
point:当转移矩阵每行只有一个非零值,即每个数只被唯一一个数转移时,可以只维护线性变换
2.模拟赛T1
tag:DP,计数
point:做DP题时,应该注意到只保留有效状态,如若转移只与集合中的数数量有关的话就不必状压
3.模拟赛T2
(待补)
12.29
1.ARC078D
tag:图上状压DP
point:容斥的思想也可以用于最优化问题中,如删的值之和最小等价于保留的最多
12.30
1.AGC017F
tag:状压DP,计数
points:
- 同时对若干个互相满足一些顺序限制的物品计数,可以考虑顺着限制依次对每个物品计数
- 有时可以将操作写成字符串的形式以方便观察性质
2.AGC004F
tag:贪心,二分图染色,数学
points:
- 对于黑白点状态转化的问题,可以考虑二分图染色改变状态以方便解决题目,
例如,形如“每次将两个相邻的颜色相同的点取反”这样的操作,转化后就变成交换颜色。
- 基环树的题可以将环先拆一条边,再考虑加上这条边带来的影响
Year: 2022
1.3
1.POJ1637
tag:网络流
point:网络流的一种使用方式是将一个从源点到汇点的流对应到某一种选择的方案
2.P4437
tag:贪心,带修改堆
point:
形如“确定树上的拓扑序使某函数最优化”一类的问题,可以采取合并点的方法解决,具体来说是:
因为,在拓扑序中,必然存在相邻两点为父子关系,我们可以考虑让哪一对父子点相邻,
并将这对点合并,即累加儿子的贡献后构造出一棵等价的树,其较原树的变化是将这对父子点合并。
1.5
1.SP7685
tag:DP,容斥
point:不要对难度产生恐惧心理;可以将物体的结构画出来后再思考如何求解
2.CF547E
tag:AC自动机,线段树,树状数组
points:
- 求串 \(s\) 在串 \(t\) 中的出现次数,可以在AC自动机上表述为求fail树子树中的标记点个数;
- 只要对一个区间询问的答案具有可减性,就可以尝试用前缀和的思想将区间变成前缀;
3.TC11054
tag:网络流
point:点导出子图最大点、边权和问题可以转化为最大权闭合子图问题
1.7
1.TC14434
tag:折半
point:应对折半有和状压类似的数据敏感度;统计答案时只需要考虑左右两边一起的限制
1.8
1.P4151
tag:线性基,图论,带权并查集
point:
- 较为复杂的异或问题一般只能利用 trie 树或线性基的辅助来按位处理;
- 求一条非简单路径的信息,有时候可以转化为用若干个环增广一条简单路径。
2.CF938G
tag:线性基,带权并查集,线段树分治
point:一些易于添加但不易于删除的结构可以用线段树分治维护时间轴使其只需要支持撤销
1.9
1.URAL1833
tag:二分图匹配,费用流,退火
point:
-
二分图最小点覆盖=最大匹配=全集-最大独立集;
-
有时可以通过对某个解的一些适当调整来证明一些性质,如此题中的:
“限制某些点对的权之和小于一个值,让所有点权和最小”这类问题,
就可以证明点权取值的特殊性。
2.AGC030F
tag:DP,计数
point:在没思路时从特殊情况或小样例入手;计数题一定不重不漏,反复考虑计数方法
1.10
1.AGC031E
tag:费用流
point:
- 有时可以尝试枚举一些未知性息使问题更易求解;
- 对于多个问题或要求,可以尝试将若干个不同的限制归类成同一种类型。
1.11
1.P6927
tag:贪心,数学
point:
-
贪心问题可以考虑尝试邻项交换;
-
对于一类确定序列元素的排列顺序并最小/大化某个关于序列的函数的问题,
若存在一个基于邻项交换而定义的全序关系,则可以归类到一种特殊的贪心模型。
2.P4765
tag:贪心,DP
point:对于确定一个序列的问题,可以考虑转化为在值域上按某种大小顺序逐步确定
3.URAL1065
tag:数学,几何,DP
point:判定一个点 \(o\) 是否在一个多边形内,可以转化为,
要求对任意三个多边形的相邻顶点 \(x,y,z\),有 \(|\overrightarrow{ox}\times \overrightarrow{oy}|\cdot |\overrightarrow{oy}\times \overrightarrow{oz}|\geq0\) ( \(o\) 在边界上时取等)
1.12
1.UOJ388
tag:线段树合并
point:对树上计算总贡献和的问题,可以考虑对每条边或每个点分别计算贡献
1.13
1.CF1625D
tag:Trie树,DP
point:
若 \(x<y<z\) 且 \(x\oplus y\geq k,y\oplus z\geq k,\) 则 \(x\oplus z\geq k\),即 \(x\oplus z\geq\min(x\oplus y,y\oplus z)\);
如果序列的顺序本身不重要,可以考虑将序列按你需要的某种方式重排
2.AGC021F
tag:计数DP,FFT优化DP
point:计数DP时,应仔细思考什么东西会对(待补)
1.14
1.TC11870
tag:数学,DP,带权并查集
point:可以将对一个区间的存在逆元的限制看作对两个前缀的限制,一般模合数可以将其拆成质数
1.16
1.CF1627F
tag:最短路,几何,全等
point:证明一些不直观的性质时可以尝试寻找一些直观的入手点,但一定将特殊情况考虑清楚
1.17
1.CF536D
tag:DP,前缀优化,图论
point:想到方法后先对样例模拟一遍
1.18
1.CF1626E
tag:图论,换根DP,BFS
point:正难则反,有时路径问题可以将题意中的路径反转后做
2.CF325D
tag:并查集,图论
point:环形问题可将原问题翻倍拼接后考虑;四连通图将障碍与空地交换后转为八连通图
3.P5813
tag:DP,二分
point:
对几种类型物品的分配使代价最小的问题,往往可以二分最小代价后,
在固定前几种物品的分配时,最大化最后一种物品的分配
4.CF283E
tag:容斥,线段树,扫描线
points:
- 只要是计算数值都可以考虑容斥,如有向图三元环个数等于 \(\large \binom{n}{3}-\sum\limits_{u}\binom{d_u}{2}\),\(d_u\) 为点 \(u\) 的出度;
- 枚举一维,对其他维快速计数时,可以考虑逐步从 \(i-1\rightarrow i\) 添加贡献。
1.19
1.CF273E
tag:博弈论,打表,DP(可以加强,用矩阵加速递推)
point:数据范围很大,数组存不下,或没思路时可以考虑打表找规律
2.CF351D
tag:莫队,树状数组,线段树
point:区间满足某种限制,可以转化为其从区间的左端点,能在满足限制的前提下,延申到右端点
1.20
1.CF249D
tag:平面几何,向量,二位偏序,DP
point:看到题不会时可以尝试思考能否正难则反
1.23
1.CF1628B
tag:性质,字符串
point:有了很难写的做法不应马上莽,而是先找一些辅助性质,思考更优且更不易错的做法
1.27
1.CF1628C
tag:构造
point:对定义中有相邻的操作,应该想到类似二分图染色的想法,即将图分类后考虑
1.29
1.CF1628D1&D2
tag:博弈论,DP,递推优化
point:一切都可以从最暴力的DP入手;优化递推可以考虑每个来源以及其贡献
1.31
1.ABC237G
tag:线段树
point:
有时可以通过将值域缩小和染色来减少复杂度或使问题直观化,如:
求序列中某个位置的答案时,可以二分答案值后,将序列中小于该值的数看成 \(0\),大于该值的数看成 \(1\).
2.1
1.CF1633E
tag:生成树,并查集
point:不同的实现方式有不同的编码难度和复杂度,以后做题时AC后可以考虑借鉴其他人代码
2.2
1.CF1632E
tag:树的直径,二分答案
point:树的所有直径的点集交非空;看到最优化问题可以考虑二分答案
2.6
1.ABC238H
tag:区间DP,计数DP
point:
2.P7219
tag:笛卡尔树,递归,动态规划优化,线段树合并/树状数组
point:看到与区间最值有关的操作可以联想到笛卡尔树;无论何时都应尝试想了暴力后再优化暴力
2.8
1.P8097
tag:DFS
,性质
point:感觉思路卡住时应该仔细读一遍题,并勾出题中的所有特殊条件
2.9
1.Customs Controls
tag:构造
point:有时看似不简单的题会有一些很简便的算法,不要一直想复杂的算法
2.High Powers
tag:数学,矩阵加速递推
points:
- 有取模的题若出现负数一定要考虑加模数变为正数;
OI
中的求数学式题亦可以尝试用递归解决,而不是拘泥于推通项
2.21
1.CF1635E
tag:二分图,拓扑排序
point:
二分图的题的一个通用入手点,
是考虑一种对解决题目有帮助的,每个点都有且只有两种的状态,
要求某个点的状态确定后,连通块内所有点的状态也一起确定。
2.CF1635F
tag:单调栈,扫描线,树状数组
point:
有时候单调栈里元素看似不能全部排除掉,但实际上可以,如只有头或尾最优,应该仔细分析一切性质
3.ABC240Ex
tag:二位偏序,Trie
树,DP
point:
题中要求选取若干个不相交且具有字典序偏序关系的字串,
注意到其本质其实是一个 LIS
问题的变形,原因可以通过把字典序映射到数域上来证明和理解。
2.22
1.AGC009D
tag:点分树,贪心
point:
注意到题中树的 Uninity
等价于其最优点分树的深度,这也确定了答案的上界为 \(O(\log)\) 级别,
接下来确定最优解时,以从子树底部到根逐步贪心选尽量小即可,证明可以反证。
题中贪心方案的灵感来源可以是:
考虑最终点分树上的根节点肯定会尽量小的选,而根节点的所有子树也会尽量小的选,
从而让所有子树对根的限制尽量弱。
2.27
1.ABC241G
tag:网络流
point:
给无向边定向可以转化为网络流中流量的流向,以使问题更方便的求解。
一般一种流函数可以代表一种方案,或者是一个割集代表了一种方案,
而网络流就可以最大化流或割的价值。
2.P1864
tag:区间 DP
point:
一个比较重要的性质是,二叉搜索树的子树内所有节点的权值形成一段连续区间,
容易的证明是考虑反证,但一个更贴近该性质和二叉搜索树的本质的证明是,
中序遍历二叉搜索树等价于把所有元素按权值升序排序,而中序遍历时一棵子树显然是一起遍历的。
有了这个性质后,进行有序的 DP
就是容易的,因为可以作为一整棵子树的点集就在一个可接受的范围内,
而我们只需要枚举子树的根就可以把当前问题转化为一个子问题。
3.ARC136B
tag:构造
point:
一个序列有序的程度,可以从逆序对的角度衡量,
而这个题里循环右移的操作不会改变序列中逆序对的奇偶性,
那么逆序对的奇偶性是否匹配就成为了两个序列能否转换的唯一条件。
2.28
1.ARC136E
tag:数论,性质
point:
首先我们可以考虑重新刻画题中两点间不可达的限制。
我们称一条边为 " \(t\) 边 " 代表该边两端 \(\gcd\) 等于 \(t\),那此时有一个重要性质,即:
\(x\) 可达 \(y\) 等价于:\(x\) 走一次最小质因数边,再走若干条 \(2\) 边,最后走一条 \(y\) 最小质因数边后可达 \(y\)。
这个性质的本质在于数的奇偶性相关,即一个奇数加上其的一个因子后一定是偶数。
那么,此时两点是否可达,就等价于对应区间是否有交,而区间的位置由每个点本身和其最小质因子决定。
3.1
1.AGC029F
tag:二分图匹配
point:
考虑将树看成 \(n-1\) 条儿子连向父亲的边,而每条边由且仅由一个包含了该边的两端点的点集提供,
故问题有解的必要条件是,将点与其所在点集连边后,形成的二分图的匹配数恰为 \(n-1\)。
构造方案时,容易想到从未被匹配的根节点开始搜索并连边,如果全遍历到就有解,否则无解。
实际上,更本质的入手点是,任何点集的并的大小大于点集的数量,否则必连成环而导致无解。
考虑这个性质,在二分图上会严格强于霍尔定理,故图存在完美匹配,且容易证明一定有解。
3.2
1.AGC027E
tag:计数 DP
,性质
point:
把本与数字无关的颜色标记映射到数域上,并通过和,积或其他运算来得到题目限制的更好的刻画方式,
有时是一种解决问题的有效方式,在本题中体现为操作后数的和模 \(3\) 不变。
那么,我们就可以考虑对原串的每一种划分计数,而为确保不重不漏,我们可以考虑为划分方式添加限制,
使得一种划分对应恰好一个本质不同的串,那么我们对合法的划分方案计数,就等价于对本质不同串计数。
而我们发现且能证明,此时添加让每个划分点尽量靠左的限制,就能满足上述要求。
最开始时也有另一种突破口,就是考虑找变化中的不变量。
3.3
1.TC16056
tag:DP
,状态压缩,生成树
point:
本题的核心,是用点集覆盖情况的奇偶性表示路径,且最优路径满足恰两个点被路径中的边覆盖奇数次。
那么,一个直观的做法就是 DP
,其中 DP
状态里存储覆盖情况,DP
值记录最小代价,
由于此时任意一种加边顺序都是合法的,故我们先枚举优惠券和状态,在转移时枚举新边加入即可。
而实际上,我们有一个更优的做法,即考虑最优路径一定是一个导出子图的 MST
且是一条链,
因为对任一路径点集的导出子图中的未选边,其权应大于其在最优路径上对应的子路径里的所有边,
否则将这段子路径替换成该边一定不劣,那我们枚举导出子图的点集,做最小生成树即可。
3.5
1.AGC027F
tag:拓扑排序,构造,贪心
point:
枚举第一次操作并定根是容易想到的,此时某点是否需要操作就由其在 \(A,B\) 树上父亲是否一致决定。
然后,我们考虑 \(A/B\) 树分别对修改带来的限制,即某点可以操作当且仅当其 son/fa
已操作。
那么,我们利用这些祖孙关系建有向图,如果图中有环则一定无解,否则一组拓扑序就给出了一组解。
当然,在这里不枚举第一次操作的终点也能做,即用决策包容性来证明,只要能操作就一定会操作。
3.7
1.CF1648D
tag:线段树,DP
,分治
point:
问题等价于求 \(\max\limits_{1\le l\le r\le n}(a_l+b_r-cost(l,r))\),其中 \(cost(l,r)\) 代表用给定区间覆盖 \([l,r]\) 的最小代价。
考虑 \(cost\) 函数具有如下转移:\(cost(l,i)\xleftarrow{i,j\in[L_p,R_p],j<i} cost(l,j)-k_p\),
发现 \(cost(l,r)\) 在转移时其 \(l\) 不变,且转移仅与 \(r\) 有关,那 \(f(r)=\max\limits_{l}(cost(l,r)+a_l)\) 也能转移,即:
\(f(r)\xleftarrow{L_p\le l\le r\le R_p} f(l)-k_p\)。此时我们就可以用 cdq
分治优化转移,答案为 \(\max\limits_{r=1}^n(b_r+f(r))\)。
还有一种优化的方式,即考虑只转移到 \(R_p+1\),统计答案时计算 \(\max\limits_{L_p\le l\le r\le R_p}(f(l)+b_r)\)。
3.9
1.P3158
tag:计数 DP
,容斥
point:
计算在网格中放东西的方案数时,一种常见的手段是枚举空行或空列,并将问题转化为不存在空行空列。
而在本题中,当确定了每行以及每列的颜色后,不同颜色的行和列里的放棋子方案独立,
故问题可以转化为计算单颜色棋子的方案数,而唯一需要注意的是空行的分配,
这可以将空行当成一种新的颜色,并将问题转化为不存在空行的放单颜色棋子的方案数。
3.13
1.CF1651E
tag:计数,并查集
point:
可以将一张图的最大匹配大小,转化为未被匹配的点数,而由于本题对度数的特殊限制,
则任一子图必然形如若干个环加若干条路径,而只有包含了奇数个点的路径中会存在恰一个未匹配点,
故问题等价于,对原图中每条奇数个点的路径,求有多少个子图恰好完全包含该路径,
而由于子二分图每边的点集连续,我们只在乎所有同类型限制里编号最大和最小的,
故在枚举路径时,从当前路径的最长真子路径里继承大多数限制,再新增 \(O(1)\) 个限制即可。
3.14
1.CF1646E
tag:数论
point:
考虑 \(x\ne y,x^i=y^j\) 的等价条件是 \(k_1\cdot c(x)=k_2\cdot c(y)\),满足 \(k_1,k_2\) 互质,\(\frac{i}{j}=\frac{k_1}{k_2},\max(k_1,k_2)>1\),
其中 \(c(a)\) 为 \(a\) 的质因数幂次向量。考虑 \(k_1\cdot c(x)=k_2\cdot c(y)\) 等价于 \(\forall i :\frac{c_{x,i}}{c_{y,i}}=\frac{k_2}{k_1}\) 且 \(x,y\) 质因数集相同,
又因为 \(k_1,k_2\) 互质,故 \(\exists t : c_{x,i}=k_2t_i,c_{y,i}=k_1t_i\),即 \(\exists a:x=a^{k_2},y=a^{k_1}\),其中 \(a=\prod\limits_ip_i^{t_i}\)。
考虑将这个条件缩放,即由于 \(\max(k_1,k_2)>1\),故一个必要条件是 \(x,y\) 不能都不是多次方数。
故考虑对所有非多次方数 \(x\),我们将所有 \(y=x^k\) 对应的 \(y\) 所在行一起算数量,记为 \(f(x)\),
则答案就是 \(\sum\limits_{x\in[1,n]}f(x)\)。而 \(f(x)\) 的值等于不可重集 \(\{ij\mid i\in[1,n],j\in[1,\lfloor\frac{m}{i}\rfloor]\}\) 的大小,就是好算的了。
本题中汲取的经验和手段是,充要条件可以缩成必要条件,以及遇到困难时可以写数学式来建立直觉。
2.模拟赛T1
tag:数学,平面图欧拉公式
point:
信息竞赛与数学竞赛的不同之处在于,其可以使用电脑帮助快速计算,
而不是必须将规律总结成一个人脑可以计算的公式。例如本题中计算函数 \(f(n)\) 值,
代表 \(n\) 条线段将平面切割成的面数,而 \(f(n)\) 的值是可以由 \(f(n-1)\) 推出来的,
虽然我们难以通过这个推法得到 \(f\) 的通项,但我们如果能快速的实现递推,我们仍然可以算出 \(f(n)\) 的值。
3.模拟赛T2
tag:DP
point:
考虑同一道题中不同类型 DP
的本质,在于记忆化搜索时不同枚举方法导致的不同子问题的选取,
例如本题中,我们没有采用枚举最后一个物品的类型,并转化成了算前面物品方案的子问题,
而是枚举了一个类型的所有物品,并转化成了算所有其他类型的物品方案的子问题。
我们选取后者的原因是,前者的瓶颈在于状态数,后者的瓶颈在于转移量,
而在本题的条件下,转移量过大的问题,相对状态数过多的问题,是更容易解决的。
3.17
1.CF678F
tag:凸包,线段树分治
point:
对于最大化某个数学式的问题,或许可以设出最大值后做一些移项和变换,将其表示成一个几何问题,
如本题中等价于求固定斜率且经过集合里某个点的直线的最大截距,若没有修改,就是经典的凸包问题。
那考虑有插入和删除的情况,首先我们用线段树维护时间轴,并将每个点的具体影响在时间轴上定位,
再对每个线段树区间单独建凸包,此时我们对每个询问时间点,找到所有包含该点的线段树区间的对应凸包,
再对这些凸包分别二分求答案后取最值即可。若将询问按斜率排序后利用单调性,还可以去掉二分做到单 \(\log\)。
3.18
1.模拟赛T1
tag:数学
point:
这道题的精度把控的十分的严,细节也十分的多,这导致考场上写挂的概率极其之高,
而一个简单没有细节和精度问题的做法,就显得十分重要,例如下面介绍的做法。
首先两点同边的情况是好做的,我们可以算出两点所在正方形边的信息,并判断是否合法即可。
而考虑两点不同边的情况,显然我们可以通过一系列类似于解方程的做法来得到这个正方形,
但这样做会有超多细节以及巨大的精度误差,而实际上我们可以将其归约到两点同边的情况。
具体来说,我们考虑找到一种点 \(u\) 的变换 \(\{v_1,v_2,v_3,v_4\}=trs(u)\),使得对任意合法正方形 \(T\),满足:
\(u\) 在 \(T\) 上是 \(trs(u)\) 中所有点都在 \(T\) 上的充要条件,且 \(trs(u)\) 中所有点分属 \(T\) 上的不同边,
那么判断 \(u,v\) 是否在同一个合法正方形上,就等价于是否 \(\exists p\in trs(v)\) 满足 \(u,p\) 同边,
而由于圆与其内接正方形的高度对称性,我们将 \(v\) 以圆心为中心,分别旋转 \(0,90,180,270\) 度,
得到的点形成的集合,就可以作为 \(trs(v)\) 的一种较好的选择。
模拟赛T3
tag:网络流,DP
,线段树维护广义转移矩阵
point:
容易想到将问题看成最大流,唯一需要注意的是,双向边同限制最大流,等价于连两条同限制单向边的最大流。
但由于这样的复杂度爆炸,故考虑优化,而优化最大流问题的一种常见思路是转最小割,
也就是说,我们需要将所有点划分成两个集合,并最小化跨越集合的边权和。
而由于题中图的特殊性,跨越集合的边权和,等于满足两点相邻且所属集合不同的点对数量。
故问题再次转化为,给每个点染红或蓝,使相邻且颜色不同的点对数量尽量少。
此时,我们把这些点对对应的每条相邻边都涂黑,则答案就等于黑线的长度。
那我们考虑这些黑线是否能做一些调整后变的更优,事实上我们发现是可以的,具体形如以下三种情况:
黑线围成圈时应直接删除,黑线有凹凸时应捋平,黑线的端点不够靠近时应尽量靠近。
而我们发现,这三种调整限制,等价于所有黑线不能有转折点和交点,即所有黑线必须将网格划分成条形,
而这个问题在不带修时就好解决了,我们分类讨论这些条形的横竖,再从左到右对每一条 DP
即可。
而实际上,就算是带修,这个问题能解决,对维护带修改的线性 DP
,我们不难想到维护其转移矩阵,
而翻转上或下的一行,我们可以用线段树维护矩阵,并在每个线段树区间上事先存好所有可能的矩阵即可。
3.19
1.AGC034D & 模拟赛T2弱化版
tag:网络流
point:
思路方向是考虑优化暴力费用流建图时的边数,考虑 \(i\rightarrow j\) 的费用为 \(|x_i-x_j|+|y_i-y_j|\),
而绝对值导致了我们无法拆边,那考虑用式子 \(|x|=\max(x,-x)\) 拆绝对值(这实际上也就是切比雪夫距离),
故可以将费用式按 \(\max\) 取到的位置,将每条边等效成四条费用分别为 \(p\in[0,3]:f(i,p)+f(j,3-p)\) 的边。
而纯加法的费用式是容易拆开的,我们建四个中转点 \(u_0,u_1,u_2,u_3\),并对每个左部点 \(i\) 和每个中转点 \(u_x\),
连一条费用为 \(f(i,x)\) 的边,对每个中转点 \(u_x\) 和每个右部点 \(j\),连一条费用为 \(f(j,3-x)\) 的边即可。
3.20
1.CF1455G
tag:DP
,线段树合并
point:
考虑暴力的 DP
,即 \(f(i,j)\) 为进行完第 \(i\) 次操作后,\(x\) 值为 \(j\) 的最小代价,注意到仅 if end
的转移不好优化,
即对命令 if v
,会有形如 \(f(i,u\ne v)\rightarrow f(j,u),f(i,v)\rightarrow f(i+1,v)\) 两种转移,
而这个转移说明了,当前 if end
命令内是独立的,唯一不与外面命令独立的仅有转移 \(f(i,v)\rightarrow f(i+1,v)\)。
那么,我们可以递归的处理当前 if end
命令内的子问题,再将这个子问题得到的答案,
与 \(f(i,u\ne v)\rightarrow f(j,u)\) 这一步转移合并即可,维护时我们使用线段树,合并时用线段树合并就能快速维护。
2.ARC137C
tag:博弈论,归纳法
point:
可以通过观察性质或打表得到如下结论:先手必胜当且仅当 \(A_N>A_{N-1}+1\) 或 \((A_N-N)\equiv 0 \mod 2\)。
一种思考方法是打表,但还有稍好的理解方式,即考虑当 \(A_N=A_{N-1}+1\) 时,\(A_N\) 操作后决策集很少,
即只能小于 \(A_{N-1}\),而当 \(A_N>A_{N-1}+1\) 时,\(A_N\) 既可以大于 \(A_{N-1}\),也可以小于 \(A_{N-1}\)。
至于 \((A_N-N)\equiv 1 \mod 2\) 的理解,是由于数互不相同,故 \((A_N-N-1)\) 的奇偶性,
代表了空位数量的奇偶性,而当 \(A_N=A_{N-1}+1\) 时,奇偶性在操作后必定会变化,而结束状态奇偶性为 \(0\)。
3.22
1.CF1654D
tag:数论,树论
point:
考虑分开处理不同连通块。发现限制可以推导,即块中任意一点的 \(a\) 值确定后,该块所有点的 \(a\) 值都会被确定。
也就是说,对块中任意点 \(x,y\),都有限制 \(\frac{a_x}{a_y}=\frac{p_{x,y}}{q_{x,y}}\),那我们可以用块中任一点 \(u\) 表示块中所有点的 \(a\) 值之和,
即 \(sum=a_1\sum\limits_{1\le i\le N}\frac{p_{y,1}}{q_{y,1}}\)(\(\gcd(p_{y,1},q_{y,1})=1\)),那么我们需要的,就是最小化 \(a_1\) 且满足 \(\text{lcm}(q_{y,1})|a_1\),
这样问题就解决了,我们让 \(a_1\) 与 \(\text{lcm}(q_{y,1})\) 取等即会最优。
这道题的核心是连通块中限制的可推导性,以后看到形如一张图的限制,就可以思考分连通块考虑。
2.CF1654E
tag:根号分治,DP
point:
第一步将问题转化为求 \(a\) 中的最长斜率相等子序列。设斜率为 \(k\),我们对 \(k\le B\) 和 \(k>B\) 采用不同的做法。
对于 \(k\le B\),我们可以枚举斜率,固定斜率后问题可以轻松的用 DP
以 \(O(NB)\) 的总复杂度解决。
对于 \(k>B\),我们可以将问题转化为,在 \((i,j)(i<j)\) 间连权为 \(\frac{a_i-a_j}{i-j}\) 的边后,求图中权相等的最长路。
显然权等于斜率,而有斜率 \(k>B\),故每个点最多只有 \(\frac{N}{B}\) 条出边,那跑最长路的复杂度就是 \(O(\frac{N^2}{B})\)。
那么我们取 \(B=\sqrt N\),就可以得到一个复杂度为 \(O(N\sqrt N)\) 的做法。
3.CF1654F
tag:SA
point:(记 \(t(l,r)\) 为串 \(t\) 中区间 \([l,r-1]\) 内的字串,记 \(str=f(k)\),当且仅当 \(str_i=s_{i\oplus k}\))
求字典序最小串,在字符串集很大时就只能贪心确定,但在字符串集较小时,可以考虑用对所有串排序。
我们借鉴后缀排序的思想,即每次对所有串的前 \(2^k\) 个字符排序,并利用 \(f(i)(0,2^k)\) 与 \(f(j)(0,2^k)\) 的大小关系,
以及 \(f(i)(2^k,2^{k+1})\) 与 \(f(j)(2^k,2^{k+1})\) 的大小关系来确定 \(f(i)(0,2^{k+1})\) 与 \(f(j)(0,2^{k+1})\) 的大小关系,
而由于异或的性质可得 \(f(i)(2^k,2^{k+1})=f(i\oplus2^k)(0,2^k)\),也就是说,所有串的前 \(2^k\) 个字符的排序关系,
已经足以不慢的推出所有串的前 \(2^{k+1}\) 个字符的排序关系,那我们这样对所有串排序,就可以得到答案。
这道题的启发是,对于每种常用的方法,我们应该了解其应用背景,以及在该背景下为何使用该方法。
3.24
1.CF1647F
tag:DP
,贪心
point:
经典的结论是最大值 \(p\) 一定是峰顶,那问题转化为,求其他位置有哪些可以作为另一个峰顶。
考虑另一个峰顶 \(x\) 是否合法,此时序列被分成:被序列左端点和 \(p\) 夹,被 \(p\) 和 \(x\) 夹,以及被 \(x\) 和序列右端点夹。
考虑对每段暴力 DP
,状态中记当前考虑位置 \(i\) 以及 \(i\) 不在的山的末尾值,可以做到单次 \(O(N^2)\)。
发现可由决策包容性得,上坡末尾应尽量矮,下坡末尾应尽量高,故可以记最大/小末尾,做到单次 \(O(N)\)。
发现其实我们做了很多次重复工作,而 \(p\) 位置不变,故每种段只需做一次 DP
,判定时比较两个 DP
值大小即可。
这道题的总结是,没有思路使应该有技巧的打表找规律,即同时要输出最优化或计数的每种方案。
2.CF1609E
tag:线段树,贪心
point:
考虑对一个区间,如何操作会最优,即一定形如删去:最左若干 a
,最右若干 c
,以及剩下的 a,c
间的 b
。
发现这个信息可以右左右两半区间的答案推出,即考虑 \(mid\) 切割了最优操作的哪个位置。
若 \(mid\) 切割了 a
或 c
,那当前答案分别可以由右半或左半的答案,再分别加上左半 c
或右半 a
数量得到。
否则 \(mid\) 切割 b
,则我们再维护左半删 a,b
以及右半删 b,c
的最优答案,而这两种的合并也是类似的。
那么用线段树即可维护带修时的答案,启发是对复杂的问题应先拆解。
3.26
1.CF1656E
tag:构造
point:
考虑用 \(u\) 子树权值和 \(f(u)\) 来刻画限制,即 \(\forall(u,fa\ne 1)\in E\),有 \(f(u)=f(1)-f(fa),f(1)\ne deg_{fa}f(u)\),
故深度相同点 \(f\) 相同,且 \(f(1)\) 和 \(\forall f(u\ne 1)\) 的值确定等价于所有权值确定,剩余限制只有 \(f(1)\ne deg_{fa}f(u)\)。
那一个最简单的办法,就是让 \(f(1)=0,f(u\ne 1)=1\),容易发现,这样就能满足所有限制。
这道题的启发是,有时不一定要解出一组通解,而是可以尝试带入一些特殊的数,例如 \(0,1\) 等。