各题型题解[updating]

各题型题解[updating]
4FGR各题型题解
算法基础
贪心
模拟
枚举
分治
排序
二分
二分答案
构造
倍增
前缀和/差分
题目大意
问对初始全为0的序列,如果每次仅允许对[l,r]区间的所有元素加1,那么求出得到target数组的最少操作次数我们知道对差分数组作前缀和能得到原数组。由于 target
是通过 \([l,r]\) 区间元素加 \(1\) 得到的,target 的差分数组
diff 显然记录了这样的过程:
- 每次 \([l,r]\) 操作对应 \(diff[l]+1\) 、 \(diff[r+1]-1\)
- 在操作结束后,对
diff作前缀和操作,得到target
我们要做的显然就是 “溯源”。
事实上,最少操作次数为其差分数组中正整数之和。
证明
显然正整数是操作的痕迹,想要做一次区间操作就不得不在 $diff[l]$ 加上 $1$ ,在 $diff[r+1]$ 处减去 $1$ ,显然差分数组每个正整数 $a$ 都代表有 $a$ 次操作从该位置开始。那么,负数,不会对这些产生影响吗?我们能保证绝不会有一次操作加在负数上,否则绝不会是最少操作解。因为要想加在负数上,只有对 $[l,r]$ 和 $[r+1,t]$ 分别做一次操作才能实现,显然只对 $[l,r]$ 做一次操作更为有效。
离散化
双指针
数据结构
堆
单调栈/队列
ST表
跳表
并查集
线段树
珂朵莉树
题目大意
对于给出的一字符串s,仅存在三种三种元素:{A,B,C},对于此字符串,我们想要做如下两种操作: 1. 当flag = A时,给出x,y,op,修改区间[x,y]的所有元素为op。 2. 当flag = B时,给出x,y,查询区间是否"合法" 一个区间合法的标志是:[x,y]区间的元素均相同,且第x-1号元素和第y+1号元素并不相同这里给出珂朵莉树的解法,实现上采用 std::set
,保留经典操作 split 和assign
,此时如果直接暴力查询,则能得到90分,剩下10分考虑算法优化。
显然,珂朵莉树适用于数据集随机的情况,但此题显然B型操作过多。我们知道当存在大量不同区间时,珂朵莉树从理想下的
\(O(m\log \log n)\)
趋近于平方级。考虑题重要的一点:元素仅存在三种。说明大量不同区间实际上是可以合并的,比如assign
操作后可能新区间能与邻居区间合并,于是选择在assign 采用
union 操作。虽然时间仍差了一步,但 union
带来的惊喜是,显然相同值的连续区间一定能被一个结点表示,那么就可以优化查询操作(这是最重要的),即得到大于
x 的第一个结点的前驱 itl,大于 y
的第一个结点的前驱 itr ,那么显然itl 和
itr 是一定包含 l 和 r
的。于是我们知道:
itl!=itr,说明 \([l,r]\) 区间值不全相同,返回 \(false\)itl-l < l && itr>r说明 \(x-1\) 和 \(y+1\) 的值相同,非法,返回 \(false\)- 如果结点只包含 \([l,r]\) 检查 \(prev(itl) == next(itr)\) ,如果成立,非法,返回 \(false\)
- 其余返回 \(true\)
1 |
|
K-D树
动态规划
背包DP
0-1/完全/混合背包
分组背包
二维费用背包
依赖背包
区间DP
树型DP
树上背包
换根DP
DAG的DP
状压DP
数位DP
插头DP
计数DP
图论
DFS
BFS
拓扑排序
最短路
最小生成树
二分图
哈密顿图
网络流
最近公共祖先
树链剖分
组合数学
错位排列
假设考虑到第 \(n\) 个信封,初始时暂时把第 \(n\) 封信放在第 \(n\) 个信封中,然后考虑两种情况的递推关系 \(D_n\):
- 前面 \(n-1\) 个信封全部装错,这种情况的出现次数为 \(D_{n-1}\)
- 前面 \(n-1\) 个信封仅有一个没有装错,这种情况的出现次数为 \(C_{n-1}^{1}D_{n-2}\)
对于第一种情况,前面 \(n-1\) 个信封全部装错,所以第 \(n\) 封只需要与前面任一一个位置交换即可,总共有 \(D_{n-1}\times (n-1)\)。
对于第二种情况,只要将那个没装错的信封和第 \(n\) 封交换位置即可。
其他情况,不可能通过一次操作来把它变成一个长度为 \(n\) 的错排。
于是可得,错位排列数满足递推关系: \[ D_n = (n-1)(D_{n-1}+D_{n-2}) \] 这里也给出另一个递推关系: \[ D_n=nD_{n-1}+(-1)^n \] 其中,\(D_0=D_1=0\) ,\(D_2=1\) 为递推边界。
容斥原理
数论
素数/筛法
质因数分解
欧拉函数
模逆元
线性同余方程
中国剩余定理
数论分块
Pollard Rho 算法
莫比乌斯反演
设 \(f(d)\) 为 \(\gcd(B)=d\) 时,满足 \(B\subseteq A\) 的集合 \(B\) 个数,即 \[ f(d) = \sum_{B\subseteq A} [\gcd(B)=d] \] 不妨设 \(F(d)\) 为 \(d\mid \gcd(B)\) 时,满足 \(B\subseteq A\) 的集合 \(B\) 个数,则有 \[ F(d) = \sum_{d|c} f(c) \] 不难发现,当 \(A\) 中出现了 \(d\) 的倍数的个数为 \(cnt_d\) ,由于使得 \(d|\gcd(B)\) 的集合只能包含 \(d\) 的倍数,排除空集,则有: \[ F(d)=2^{cnt_d}-1 \] 利用莫比乌斯反演,得到 \[ F(d)=\sum_{d\mid c}f(c)\Leftrightarrow f(d)=\sum_{d\mid c}\mu(\frac{c}{d})F(c) = \sum _{d\mid c}\mu(\frac{c}{d})(2^{cnt_c}-1) \] 带入 \(d=\gcd(A)\) 即可
1 |
|
字符串
后缀函数
计算几何
其他
打表
由于 \(n\leq 10^6\) ,数据较小,可直接枚举。为了实现更快的速度,我们枚举并同时记录每个平衡数,直到得到第一个大于 \(10^6\) 的数值平衡数。然后二分打表即可。
1 | int nextBeautifulNumber(int n) { |




