题目总结
看见方案数平方,考虑两个人分别取,两两匹配。
决策单调性,用队列维护。
二分图+字典序,倒序考虑。
P6843 [BalticOI 2015] File Paths
仔细读题,情况考虑全。
先从最初的暴力贪心想起,数形结合,单调栈或主席树维护。
两个玩意儿都在变,不好维护,可以考虑将一部分东西转移,发现是固定的。
取模还要比大小,用对数比。
和某年提高压轴很像,最小割平面图转对偶图,跑最短路,连边时 id 千万别搞混。
有依赖关系,还有贡献,最大流。情况考虑全,如环。
背包,带有 FMT 的思想。
仔细读题,背景奇怪,强行套了个 SA,然后因为贡献具有包含关系,所以从大往小插入,并查集维护。
首先要发现路径的特点,然后把路径拆开,贪心,单调性,分治,主席树维护。
数据结构裸题。如果要实时加边,维护连通性,但还要用到树剖或 LCA,可以考虑先把树建出来。
区间 DP,发现就好做了。
双指针+爆搜,最初想的是双指针+并查集,发现不好维护撤销操作,然后发现爆搜也行。
涉及到最短路限制的,考虑最短路图,然后 DAG 上 DP。
发现单调性,有撤销操作的考虑主席树。
位运算,果断拆位,对于这种比大小的题,可以让前 i 位相等,然后 i+1 位考虑不同,DP 即可。
列出暴力 DP 方程,区间相交问题用线段树。
把逻辑关系理清即可。
妥妥的诈骗题。
\(\gcd(\gcd(a,b),c)=\gcd(a,b,c)\),直接枚举,复杂度调和级数。
有些分层图的思想,一层一层 DP,左、右、梯子三种情况。
诈骗题。发现选的是连续的,multiset 维护。
P4733 [BalticOI 2015] Tug of War
二选一先建图,树是确定的,基环树有两种情况,背包 DP,bitset 加速转移,找环用链式前向星!
一棵树至多有两个重心,且相邻。
像这种有大小关系的,列不等式观察。
从简入手,看能不能将问题简化。
LIS 问题要注意观察性质。
正推逆推分别考虑,看哪种写起来简单。
数学题,找找规律。
先观察整体的取值范围,再考虑如何构造出最小值。
像这种异或类的计数,可以逐位考虑,DP 状态设计时考虑进位。
博弈论题,先考虑决胜点,然后倒退。
奇数个相同的数异或后值不变。
计数,还考虑大小关系,数形结合。
适当的转化,所有路径的边权最大值最小,最小生成树,连边用 BFS。
三进制状压 DP,注意多观察性质,简化代码。
树上 DP,发现一个节点最多只能连两条边,跑两遍 DP 即可。
贪心+线段树,用到了一个 trick。
对于第 i 个点,赋值 i。如果一个任务的截止点为 j,则将 \([j,n]\) 减 1,如果最小值非负,则当前任务集合成立。
所以可以将价值排序,贪心地往线段树里插入,如果没法插(有 0),那么找到第一个 0 的位置 w,如果 \([1,w]\) 中有价值比它小的任务,删除,再插入,否则的话扔到备用线段树上。对于删除,如果本来就在备用线段树上,直接删,否则在正式线段树上把他删掉后看能不能在备用线段树上找到一个可以代替且价值最大的。
所以我们开三棵,第一棵判断当前任务集合是否合法,第二棵记录当前选了哪些任务,第三课记录有哪些没选,代码不好写。
可以发现最小众数只可能是 1 或区间第一个数。所以从大到小排序,每加入一个数,就计算他的贡献,链表维护。复杂度 \(O(n)\)。
分块模板题,查询有多少大于 \(x\) 的数时,整块内二分,两边暴力找,每次给两边加数时,重新排序。复杂度 \(O(q\sqrt n\log\sqrt n)\)。
线段树小 trick。是 P4511 的基础。
先贪心,对于两个序列,肯定是一大一小匹配最优,把 B 排序。为了方便操作,将序列 A 中的元素替换成 \(h-a_i\)。
现在问题转化为,有多少个长为 len 的区间,满足内部排序后,每一位的值都小于序列 B 的对应位。
考虑把 B 中的元素放到数轴上,对于第 i 个元素,它的前面至少要有 \(len-i+1\) 个数,而每次插入一个 \(a_i\),都可以给后面贡献 1,如果最大值为正,则说明没法匹配,否则可以。这可以用线段树维护,区间修改,全局最大值。复杂度 \(O(n\log n)\)。
线段树套分块优化决策单调性 DP。
定义 \(f(i,j,i_2,j_2)\) 表示从 \((i,j)\) 走到 \((i_2,j_2)\) 的最优路线。
转移时枚举 \(\frac{i+i_2}{2}\) 行的决策点进行转移,这样就可以放到线段树上了,复杂度 \(O(n\log nm^3)\)。
我们定义 \(p(i,j)\) 表示从 \((x,i)\) 走到 \((y,j)\) 的最优决策点的纵坐标,然后通过画图发现 \(p(i-1,j)\le p(i,j)\le p(i,j+1)\),因为如果不是这样,必然会产生交点,然后就矛盾了。
所以枚举决策点的复杂度可以被均摊掉,复杂度 \(O(n\log nc^2)\)。时间上能过,空间上不行。
充分发挥人类智慧,考虑将行分块,令块长为 len,这样每个叶子节点就表示了一个单位块,直接暴力转移,复杂度 \(O(m^2len)\),然后上传操作不变。复杂度变为 \(O(\frac{n}{len}\log\frac{n}{len}m^2+nm^2)\),len 可以取 20,空间不会爆。
没点脑子真想不出来,所以我没脑子。
可以发现,所有操作结束后,图中至少有一条从 1 到 n 的路径,我们现在就要找到这样的一条。
由于删边对后面有影响,所以越考前的操作优先级越高,所以我们按照优先级给对应的边赋值,具体的,第 i 次询问对应的边的权值为 \(2^i\)。这样最后跑一边最短路就行了。
然而数太大,高精度复杂度太高,我们可用可持久化线段树。具体的,维护区间的哈希值,对于两种情况,从高位到低位比较哈希值是否相等,找到第一位不相等的,比较大小即可。
复杂度 \(O(n\log^2 n)\)。
上一题小 trick 的加强版。多了个进位的操作,所以还需要维护连续的 1 段。
线段树优化建图。维护两棵线段树,出树从上到下连边,入树从下到上连边,对应的叶子节点连边。每次将区间拆分,由入树连向出树,跑最短路即可。
和上一题差不多,需要注意的是,不要建双向边,否则会在一棵树上反复横跳。
P3599 Koishi Loves Construction
构造题。
第一问:显然 n 只能放在第一个,所以当 n 为奇数时,\(\frac{n(n+1)}{2}\mod n=0\),无解。考虑将最终的前缀和模数构造成 \(0,1,-1,2,-2,...\),相邻两位的差为 \(1,2,3,...\),显然可以构造。
第二问:我们发现当 n 大于 4 且为合数时,必然存在两个比 n 小且不同的数 x,y 满足 \(x\cdot y\mod n=0\),所以不合法。然后我们令每个数为 \(1,\frac{2}{1},\frac{3}{2},\frac{4}{3},...\),求模 n 后的数即可,显然满足排列的性质。
组合计数题。
将鱼按长度从小到大排序,然后我们发现,对于同一种颜色,以长度小的结尾的方案,长度大的一定可以包含。所以我们只考虑每种颜色长度最大的鱼。
为了避免重复,规定以下两个限制:
-
如果当前颜色选的是最大可能数,那么长度是没选且长度最小的鱼的二倍的鱼的颜色不能选。
-
否则,长度比它大的鱼的颜色都不能选。
剩下的直接用乘法原理就行,线段树维护区间乘积。编号一定不要弄混!
小总结
多测不清空,爆零两行泪
变量名不要重
for循环中的计数变量记得清空
复制粘贴的部分记得修改
沉着冷静
注意 \(dfs\) 是否构成一颗树,如果不是记得使用 \(vis\) 数组 P3958奶酪
细节不要出错,多种情况要想全 P3952时间复杂度
仔细观察题目的影藏性质,如单调性等 P2827蚯蚓
注意图的重边要取 \(min\) P1850换教室
如果出现要分两组的情况,考虑二分图 P1525关押罪犯
如果要二分数组的下标,一定要保证该数组单调,也就是要排序 P1525关押罪犯
字符串哈希时,mi[0]一定要等于1,不是0
treap分裂后记得merge回去
注意函数爆栈的问题
可持久化数据结构只要经过之前的节点就要重建
字符串哈希不是2进制!
set开头的元素是最小的
循环嵌套变量不要重
动态规划数组的初始化要小心,如果要需要取模就不要设成0
如果出现了神奇的问题,多半是RE了(数组开小,访问负坐标......)
AC自动机建失配树要注意数组下标的意义
栈空间爆炸会导致本地出现RE等玄学问题
倍增预处理是递推,不是递归
long double 用 %Lf
网络流优化全加上,tot 从 1 开始计数
强制在线题一定记得异或上一次的答案,并更新 lst
DP 注意边界条件,不要 RE
DP 转移可以抽象成最短路。
构造题,不要想复杂,卡着一个角试。
DP 注意决策单调性,单调栈,二分求决策点更换时间。
构造题,别直接看根本,可以弄点意义不明的简单方法(连边),然后看有没有规律。
二分长度找回文串,长度为奇和长度为偶分别是单调的。
mp.count(x)
比 mp[x]==1
快得多。
约旦消元,方便判断无解和无数解;高斯消元,方便暴力枚举自由元。两者区别:高斯只往后消元,不用把没用的挪到后面。
看到 5e4 考虑根号分治。
倍增考虑临界点情况。
背包问题,如果物品空间太大,以价值为下标考虑。
无向图最短路树,有可能需要再建反边。
往往你没思路的题,隐藏着很强的性质。
一定要检验贪心正确性。
注意 01bfs 的单调性,每时每刻 deque 里只存在小于等于两种值。
注意定义域。
贪心可以从一些特殊情况开始考虑。
多看看特殊性质。
数形结合。
观察一些东西的独立性。
考虑多种统计答案的方式。
注意贪心和 DP 的场合。
栈空间爆了也会显示 RE。
DP 转移要分类讨论清楚。