csp-s复习
字符串
trie
kmp
ac
manacher
dp
看起来能dp的就胡个dp上去
1.优化状态(大概率会使用贪心)
2.套公式(前缀和/单调队列...)
3.找性质,有哪些是无用的[P11218]
trick
排列计数
排列的状态很难压进去,所以我们考虑如何将这个去掉。
我们的dp方程要用最少的空间来转移,也就是把状态压进去使之能计算贡献和转移
[CF856C]:贡献只和奇数位或偶数位置有关然后奇数位和偶数位有关,这些位置我们是可以随便填的,所以我们的dp方程是这么写的
dp[i][j]为前i个数,最后一个相对大小为j
单调队列
滑动窗口最大/最小值
连续子数组的平均值大于阈值的个数
下一个更大元素(单调栈)
斜率优化
贪心
反悔贪心
[P3419/4053]当取到不满足条件的时候那么就反悔前面一个不取,使答案最优。这类问题通常贡献数与数不影响,贡献简单
ddp
简单dp加上修改
数论
exgcd
int exgcd(int a,int b,int &x,int &y){
if(!b){
x=1,y=0;
return a;
}else{
int g=exgcd(b,a%b,x,y);
swap(x,y);
y-=x(a/b);
return g;
}
}
excrt/crt
会考吗?
莫反
我只会比较公式的题
图论
Kruskal重构树
动态路径权值问题
网络流/二分图匹配
配对
最小点覆盖=n-最大独立集=最大匹配
染色。首先将所有答案都加上去,然后考虑减掉最小的不合法贡献就是最大答案。最小的不合法贡献,通常是不能相邻,呢么这个就要删掉,这就可以染色连边然后求最小割。
这样可以刻画的限制一般形如:如果一个元素被划入集合a,另一个元素被划入集合b及之后,产生的代价。这里需要保证非负性,用最小割
拓扑排序
2-SAT
Tarjan
圆方树
最小生成树
[CF1633E]最小生成树的形态只和边的相对大小有关
ds
线段树/树剖(树转化成区间)
- 维护区间平方,利用费马小定理,发现指数到后面有循环
- 区间a[i]=a[i+1]的数的个数,记录a[l],a[r],sum
- 区间lca
- 区间gcd(使用差分gcd(a,b)=gcd(b,a-b))
线段树上二分
找第一个>w的前缀和
并查集
维护森林到根的距离,如果是基环树的话只能重构,从这个拓展出有向基环树图中的最长链
l1r1==l2r2可以使用倍增并查集解决然后不停往下push_down
平衡树
文艺平衡树如果不带反转可以查询某个数的位置
文艺平衡树如果带反转可以查询特定数的位置,始终不改变,记录的是每个点对应的当前区间是否出现这个数
树状数组
cdq 分治
公公又式式
可持久化线段树
线段树合并
树剖
对边的操作一定要转化到点上,否则做不了。
博弈论
其他技巧
倍增
好用爱用,优化模拟
哈希
双哈希,冲突概率要控在1e-7以下
构造
如果有一个答案下界/上界,不妨去构造上界/下界
双指针
很多二分加在一起可以变成双指针,好写捏
根号平衡
询问O(1),修改O(n)或者反一下就可以分块
人类智慧
[CF1956E12] 暴力时间太多,考虑暴力的次数,暴力一定次数就会产生条件将题目变得简单
观察样例/大样例
[P6187]发现许多贡献都是相同的,所以预处理一下
看到二元组想到建图
看好限制,有一些是只和一些限制有关的,然后这个就可以大大优化状态
看到绝对值就要拆绝对值
贡献独立,那么就分开计算
基环树断环上边->树
求第几个排列,一位一位确定
答案有指数,可以取对数
模拟题意,然后用数据结构/倍增优化
可以排序就排个序吧
容斥
如果求和号比较小可以一个一个算
树上对于每个点都询问可以考虑线段树合并
最小化最大值,最大化最小值二分答案
区间加转化为差分
区间问题考虑枚举l,r使用扫描线/双指针。枚举右端点,然后求有多少左端点,这种用的多一点
从左到右二分可以变成双指针
贪心先用邻项交换,要求是交换不会对其他位产生影响
首先想看到计算合法的方案数,套路地先考虑如何判断一个方案是否合法。“至少若干个”等,见到此类计数应当迅速反应。由此也可能引出容斥
可以用网络流那么就用一下,然后利用各种东西(通常是先转化成最小割)然后利用其它一些东西求最小割
质数的稠密性,1e18下1500个数会出现一个质数,大概是log^2/2级别?
括号问题的经典结论:
- 一个括号序列合法当且仅当且
函数化编程,线段树push_down+change,push_up+merge这样比较方便
统计多少段区间出现的数都恰好出现偶数次
集合问题:背包或状压
注意推式子时应尽量拆,移项,减少未知数
1e6个int是4MB
1e6个vector是25MB
我们在树上对于一条路径更新周围一些点可以用更新父亲
有向无环图有一种建反图的套路,可能有点用
一个数的因数个数大约为log(随机情况)最坏大概log^2
矩阵游戏先构造,再调整
dfs搜索树上只存在返祖边,bfs搜索树上只存在深度不超过1的点6
将删除变成加
枚举要求的,然后逐个验证
1.在构造题中看到相等,我们就能想到各种-1和1相抵消。
2.二进制想到拆位
3.数的约束条件想到并查集,差分约束,dfs
4.看到要求的比较难求。
----1.正难则反
----2.进行转换,都试一遍
5.破环成链
6.将删除转换为添加
7.看到能dp的题目就做dp,先压状态,然后进行优化
8.题目要求输出每个子树的答案。想到各种合并,根据题目进行选择
9.看到跳的多的想到倍增
10.手玩样例很重要
11.区间最大值想到单调栈和笛卡尔树
12.有简单的分解质因数方法
13.一个限制一个限制满足
分数规划
期望
概率乘贡献=期望
期望有可加性
期望dp,用自己表示自己,然后移项得到转移方程。
但是硬表示的话可能要高斯消元,我们可以设计一个i走到i+1的期望,这样就会好转移很多
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期