csp-s复习

字符串

trie

kmp

ac

mine

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

线段树/树剖(树转化成区间)

  1. 维护区间平方,利用费马小定理,发现指数到后面有循环
  2. 区间a[i]=a[i+1]的数的个数,记录a[l],a[r],sum
  3. 区间lca
  4. 区间gcd(使用差分gcd(a,b)=gcd(b,a-b))

线段树上二分

找第一个>w的前缀和

并查集

维护森林到根的距离,如果是基环树的话只能重构,从这个拓展出有向基环树图中的最长链

l1r1==l2r2可以使用倍增并查集解决然后不停往下push_down

平衡树

文艺平衡树如果不带反转可以查询某个数的位置

文艺平衡树如果带反转可以查询特定数的位置,始终不改变,记录的是每个点对应的当前区间是否出现这个数

树状数组

cdq 分治

公公又式式

可持久化线段树

线段树合并

树剖

对边的操作一定要转化到点上,否则做不了。

博弈论

mine

其他技巧

倍增

好用爱用,优化模拟

哈希

双哈希,冲突概率要控在1e-7以下

构造

如果有一个答案下界/上界,不妨去构造上界/下界

双指针

很多二分加在一起可以变成双指针,好写捏

根号平衡

询问O(1),修改O(n)或者反一下就可以分块

人类智慧

[CF1956E12] 暴力时间太多,考虑暴力的次数,暴力一定次数就会产生条件将题目变得简单
观察样例/大样例

[P6187]发现许多贡献都是相同的,所以预处理一下

看到二元组想到建图

看好限制,有一些是只和一些限制有关的,然后这个就可以大大优化状态

看到绝对值就要拆绝对值

贡献独立,那么就分开计算

基环树断环上边->树

求第几个排列,一位一位确定

答案有指数,可以取对数

模拟题意,然后用数据结构/倍增优化

可以排序就排个序吧

容斥

如果求和号比较小可以一个一个算

树上对于每个点都询问可以考虑线段树合并

最小化最大值,最大化最小值二分答案

区间加转化为差分

区间问题考虑枚举l,r使用扫描线/双指针。枚举右端点,然后求有多少左端点,这种用的多一点

从左到右二分可以变成双指针

贪心先用邻项交换,要求是交换不会对其他位产生影响

首先想看到计算合法的方案数,套路地先考虑如何判断一个方案是否合法。“至少若干个”等,见到此类计数应当迅速反应。由此也可能引出容斥

可以用网络流那么就用一下,然后利用各种东西(通常是先转化成最小割)然后利用其它一些东西求最小割

质数的稠密性,1e18下1500个数会出现一个质数,大概是log^2/2级别?

括号问题的经典结论:

  1. 一个括号序列合法当且仅当sumi0sumn=0

函数化编程,线段树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.一个限制一个限制满足

分数规划

mine

期望

概率乘贡献=期望
期望有可加性

期望dp,用自己表示自己,然后移项得到转移方程。
但是硬表示的话可能要高斯消元,我们可以设计一个i走到i+1的期望,这样就会好转移很多

posted @   wuhupai  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示