贪心
最优化的通用套路,调整法。
邻项交换、邻项合并、反悔贪心、模拟费用流。
邻项交换的正确性来源于,你的序是一个全序。
还有一种题调整是一个形如二维偏序的形式,这样可以考虑其对偶,一条折线划分成两部分。如 QOJ9222。
构造
常用方法:
- 进行一些问题转化然后使用构造性的算法来解决。
- 增量。
- 构造或者直接随机一个基本解,在其基础上调整。
- 构造一个基本操作。
- 组合 Pattern。
CF862C
- 直接随机 \(n-1\) 个数,然后判断能不能通过最后一个数调整。
- 随便选 \(n-2\) 个数,然后找出两个数调整一下,可以证明一定可以。
- 熟知 \(4k,4k+1,4k+2,4k+3\) 的异或和为 \(0\),于是直接增量。
CF468B
观察一下:若存在 \(x,y\in S,x+y=a\),那么 \(x,y\) 必须属于同一个集合。\(b\) 同理。
那么连一下边,变成若干个连通块。对每个连通块判一下能不能属于 \(A\) 或者 \(B\) 就行了。
也可以直接 2-SAT。
P7115
对每个颜色分别整理肯定没前途。考虑 \(n=2\) 咋做。
对每个柱子分别做。在剩下两个柱子上给他桶排一下,这样能在 \(O(m)\) 次操作内做掉。
直接分治即可在 \(O(nm\log n)\) 次操作内做掉。
P6892
首先显然操作次数下界是 \(n\)。如何构造?考虑每次把首尾两端整理好一部分,然后递归构造即可。
zig-zag Pattern
考虑这样一个图:
这样每一步之前走过的点都是一个区间,而且距离为 \(1,2,3,4,\cdots\)。非常优美。
例题 P9837,直接建模成上面这个数轴就行了。
定义一个图的边集的 \(k\) 旋转为:每条边 \((u,v)\) 变为 \((u+k,v+k)\),模意义下的。
现在,找出一个图,使得其的 \(0,1,2,\cdots,n-1\) 旋转,这些图的边集不重复,且并起来是一个有向完全图。
模拟赛
11.6
T1
给定一个长为 \(n-1\) 的数列,建一张图,对于所有 \(1\leq i<n\),\(i\) 可以到达 \([i+1,a_i]\) 的点。问所有点对最短距离之和。
\(n\leq 10^5\)。
设 \(f_i\) 表示从 \(i\) 出发的最短距离之和。考虑从右往左挨个计算 \(f_i\),发现可以转移。
T2
给定 \(n\),有一个 \(n\times n\times n\) 的立方体。如果在一个位置放置一个监控,那么它可以监控其前后左右上下六个方向的所有格子。
构造一种放置监控的方案,满足每个格子都被监控到,且监控个数不多于 \(\lfloor\frac{n^2}{2}\rfloor\)
考虑把整个立方体切成八个部分,用 \((\frac{n}{2})^2\) 个点覆盖四个部分。发现直接对于 \(n\) 个平面放排列的 \(n\) 次循环即可。
T3
。
T4
一个内向基环树,每个点有点权 \(a_i\),设 \(i\) 连向的点为 \(p_i\)。每个时刻,对于每个 \(i\),同时发生以下事件:若 \(a_{p_i}\geq a_i\),则 \(a_i\) 自增 \(1\)。
\(q\) 次询问,问你在 \(d\) 时刻 \(a_k\) 的值。
\(n,q,k,d\leq 2\times 10^5\)。
首先考虑一个根向树怎么做。可以直接在 dfs 的过程中线段树维护。
考虑有环。注意到环上的最小值一定是一直自增,直接断开即可。
T5
给定 \(n,k\),问 \(\{1,2,3,\cdots,n\}\) 的子集族有多少个子集满足每个数出现至少 \(k\) 次。
\(n\leq 3500,0\leq k\leq 2\)。
分类讨论,对于 \(k=0\),答案显然为 \(2^{(2^n)}\)。
对于 \(k=1\),容斥钦定 \(i\) 个数一定不出现,则答案为:
对于 \(k=2\),容斥钦定 \(i\) 个数一定出现 \(0\) 次或 \(1\) 次,然后在这 \(i\) 个数里面枚举 \(j\) 个出现 \(1\) 次,剩下 \(i-j\) 个不出现。然后枚举 \(t\) 表示 \(j\) 个只出现 \(1\) 次的数被划分为几个集合,可以得到:
可以直接 \(O(n^2)\) 计算。
11.8
T3 P11151
考虑每个点会走到哪个点:其能走到的范围为位于 \([x,x+V]\) 的所有点。若这些点中存在一个 \(y\) 满足 \(p_y<p_x\),则可以走到 \(x\) 右边第一个比 \(p_x\) 小的地方是最优的。否则走到 \([x,x+V]\) 的最小值最优。
那么这样可以倍增维护一下。注意最后的边界问题。如果出现二类边就要直接走到最后。这可以通过额外维护一个倍增表示当前覆盖到哪里来判断。
11.10
T4 P5372
黑白染色建二分图,然后发现两张图都是最大匹配,考虑这两张图匹配的对称差,一定是一条链加若干个环。然后直接在这张图上 dfs 就行了。
11.13
T2 P11757
把每条边当成一个点建图发现是一棵树,直接树上倍增处理即可。
11.15
T2 LOJ551
既然说不能放重,那只能考虑构造一个匹配,B 选一个点之后 A 选匹配剩下的那个。容易发现奇数一定不行。偶数爆搜一下 \(4,6\) 可行,所以 \(\geq 4\) 的偶数可行。
T3 P8326
把环找出来后,若环长度不是 \(8\) 的倍数则直接无解。考虑两个颜色怎么做。
注意到这个图特殊在一个点最多在两个环中,所以考虑把一个点当成一条边,一个环当成一个点。转化之后这个图是二分图,于是这样直接跑欧拉回路,每个点入度出度相等,直接黑白染色即可。
四种颜色就对两种颜色边的子集再跑一遍就行了。
杂题
UOJ783
最终序列的最大值即为原序列的最大值和所有被触发的操作的 \(y_i\) 的最大值。考虑对每个操作 \(i\) 处理出,若其被操作,则能触发的后续操作的 \(y_i\) 最大值,设为 \(f_i\)。
操作 \(i\) 能触发 \(j\) 的条件是:\(T_i\cap S_j\neq \varnothing,i<j,y_i\geq x_j\)。后面两个限制是二维偏序的形式,而前面区间相交很难处理。
考虑对 \(i<j\) 这一条件进行 CDQ 分治。那么先递归求出后半段的 \(f_i\),然后计算后面的对前面的影响。可以把左边的区间按 \(y_i\) 排序,右边的按 \(x_j\) 排序,双指针之后是线段树区间 chkmax 区间查 max。直接做即可。
CF2143F
CF2115C
CF2104G
CF2077E?!?
CF1887D
CF1957F2
ARC105E
偷题
dmy noip r4t4
给你一棵树,树上每个节点的权值有取值范围 \([0,R_i]\)。问有多少种赋权值的方案满足每个非 \(0\) 连通块的和是 \(m\) 的倍数。
\(n,m\leq 2\times 10^5,nm\leq 10^7\)。
直接连通块背包然后 dsu on tree 优化即可。