规律
1.两数相减,相加的最大,最小值
2.由最初的状态递推
3.无强制顺序,排序,不能排序,则与顺序有关
4.对于一段等差数列,不用一段一段的算局部整体,可以从整体一步步加差值
5.需要从一段式子推到结果困难,将结果反推式子,(从结果的需要特性式子需要全部满足)
6.式子移项。式子消去
7.将一步步走到结果,反推到能走到这个结果一定会存在什么步骤
8.枚举两个位置,当一个位置可由另一个位置一个条件推出时,一个位置即可
9.删边最小=加边最大
10.隔板法:C(m-1,n-1),
11.统计区间的值,当前状态取决于上一个状态与当前值,dp[当前位置][结果可能]=数量
12.一个后面情况全由第一个决定,枚举第一个所有情况
13.分类,一共有少数个类别,由少数个类别组成的多个数,分类
14.一个数的改变对前面有影响或对后面有影响
15.树(从下往上递归:对于从上往下递归结果的选择需要知道后面值的情况)
16.使用排列构造,统计每个数字的使用的次数
17.考虑奇偶性,(例:奇偶排序->可奇偶对换->全排序)
18.在有限次操作下完成,二分或者二进制(因子相关)考虑
19.01为1,11为0,00为0,考虑异或,标记传递(考虑1.当前行需翻转的标记传递,2.当前行需传递的标记给下一行的标记更新)
20.注重循环节(重复某个操作)
21.有人获胜的期望轮数=1/(一轮中有人获胜的概率)
22.在对一段序列进行重复性操作,且每个操作进行对下一个操作本身不造成影响,可多个操作同时进行(小白月赛77)
23.字段分离(牛客练习赛144)
24.在操作数有限的情况下,可以先假设操作数无限多,再考虑有限的情况
25.取数图形化(牛客练习赛144)
26.图形模拟:提前将下标算出赋值
27.临界条件:最大值(867)
28.(839D)对于两个数 a,b,选x使得a=abs(a-x),b=abs(b-x),当x的值小于 (a+b)/2 时,它保持原本的单调性,当x的值等于(a+b)/2时,a==b,当x的值大于(a+b)/2时,单调性反一下
29.(834F)进位作为临界点
30.倒序+前后之分(834G)
31.(820f)(s1s2s3...)%9=(s1+s2+...)%9,可前缀和,将值域处理成余数的暴力枚举来满足式子,例如(a+b)%m==k首次出现的a,b,将可以的处理成余数记录首次出现位置,暴力枚举余数
32.找到周期性开始点取余周期(811E);周期(最小公倍数)后续的模拟取决于第一次,自身的操作不影响条件,枚举周期(abc319E)
33.前缀异或(895E)
34.非1的乘积最多29次>1e9,数据范围卡1e9(895G)
35.3*3联想枚举所可能性
36.数据范围:1<<=n<=1e5,1<=ai<=n,考虑坐标指向值建图(897D)
37.贪心,a,b,a上升,b下降,枚举,看幅度(831C)
38.dp删(匹配的思路(牛客专项训练删括号)
39.子节点隔着根节点相差2(牛客专项训练联合权值)
40.后续数由初始数组合而成,添加从初始数入手(牛客小白78第k)
41.对于每一层增加x个,导出子图满二叉树的个数增加x+x/2+x/2/2+....(牛客小白78数树)
42.求集合任意两元素的异或和,直接拆位,根据异或性质得:cnt[i][1]*cnt[i][0]*(2^i)(牛客周赛12)
43.前缀最大值,后缀最大值,(操作将不单调的变成单调的)寻找大于i的最左边,大于i的最右边(codeton round 6 C)
44.01串变成相邻互不相同的(方式:檫除字符),组合数
45.与数字有关,最大数字为9,最小数字为0,考虑暴力,二进制枚举(abc321C)
46.(abc321E)对于二叉树上的点x,令x父亲结点为fx,与其距离k的点的集合为{x下方子树中与x距离k的点集,与fx节点距离k-1且不在x子树上的点集}。
而与fx节点距离k-1且不在x子树上的点集 = 与fx的另一个儿子(x的兄弟)y距离为k-2且在y子树上的点集+与fx节点距离k-1且不在fx子树上的点集。
47.z-y=y-x,->2y=x+z,x+y必为偶数,x,y同为奇数或偶数,分组思想(团队2:求和)
48.考察图形的翻转+平面图形的移动(abc322_d)
49.01背包遇到多个背包组合考虑转换成10进制枚举(每个背包最大值<=9并且枚举物品数量较小)(abc322_e)
50.2的幂次方(x&(x-1)) (891c)
51.常见规律 等比,等差,前项式,下标,2的幂
52.字符串消除字符成为最小过程(156C)每一次的消除过程:只会是消除前一个之后可以不断地消除(一个小的出现,会把前面所有大的全部消除完,递增最小值,)
53.经典贪心处理(luogu月赛2023广东省P9369)
54.dp经典(匹配单词,字符串最少删除多少字符满足全由单词组成) (C - The Cow Lexicon POJ - 3267一战到底第二题)
55.字符串前后缀匹配经典(任意两个字符串组合包含目标子串) (atcoder324E)
算法
1.点到线段的最短距离公式
2.bfs求最短路(在n*m的图上,套用spfa板子),本质:将点的操作移动转换为边
3.树的深度
5.dp二维,一维位置,二维所有可能结果,dp两种结果选与不选
6.取石子的sg函数打表
7.带权并查集的关系维护,并查集(子树合并:节点数)
8.基环内向树(特点:从任意一个点出发,必定会跑到环内)
9.最短路或最长路分层图的建立,路径上最大值最小(边权传递),相遇问题:枚举相遇点+反向最短路
10.最小生成树:每个结点多个选择,多建多个源点与之相连
11.记忆化
12.树状数组 + 离散化维护区间移项
13.期望dp(背包上的运用,枚举状态,枚举物品,状态转移)
14.sg打表,sg函数(拿l~r)
15.dfs树的底层向上递归, 向下递归
16.最长路
17.dp当前状态不仅与上一位相关,还与其他特定位相关,设法将位置关系相联系(例:n个人围圈子)
18.dp满足条件的子序列(可以不连续)个数,考虑0~k位置满足条件的子序列的个数与0~k - 1位置满足的条件的子序列的个数(一般为第二维)(例:游游的9倍数)
19.01背包枚举所有组合方案,(bitset优化预处理所有组合方案, 在总值较小的情况下使用),01背包的变形(选与不选)
20.拓扑排序
21.数位dp在二进制上的使用,在dfs的过程中需要一直满足满足某个条件 &&
22.字符串hash(子串访问)(牛客小白月赛77)
23.走迷宫bfs在可以不动,规定时间不能走的解法(Codeforces Round 878 (Div. 3))、
24.状压dp, (最终状态已知道),枚举每一子状态转移(abc318)
25.给定一个初状态,末状态,若干操作转变状态,数据范围较小,直接状态压缩所有状态经历操作,(Codeforces Round 883 (Div. 3))
26.字符串hash去重(sort + unique)(团队1)
27.置换环(842D)
28.完整二叉树的的子树交换(826D)
29.dp无后效性(每一次合法的承接)(826E)
30.图中链和环的处理(循环找环,循环入队)(895F)
31.l到r的数位dp
32.经典dp:到了i位置取了j个数的使得条件的成立的方案数(牛客周赛11, 专项训练dp被3整除的序列)
33.01背包(价值随时间的变换而变化)(牛客专项训练dpcodeforce)
34.合法括号方式:卡特兰数
35.最短路dis:1个点有多条到终点的最短路判断(牛客周赛13小红的转账方式)
36.奇偶性的传递性,种类并查集(扩展域,)(团队2P_5937_CEOI_1999_Parity_Game)
37最短路 + 最小生成树的应用(luogu\月赛\KMOI Round 1\Easy_Construction)
38, 龟速乘:解决快速幂之后的爆long long
39.01个数的不同方式组合->概率dp, 常见(dp[i][j]到第i个有j个0或1)(luoguP2111 考场奇遇)
40.条件概率(luogu / UVA11181 条件概率 Probability | Given)
41.组合数恒等式->杨辉三角(luogu P2822[NOIP2016 提高组] 组合数问题)
42.n个矩形的面积并 (race/牛客/多校/武汉大学2023年新生程序设计竞赛(同步赛)覆叶之交)
43.带小数的二分(cf156 b)
44.概率dp(abc323 E)最后一次的概率,将其他计算后乘
45.前缀和+二分经典(牛客14 小红的子串)
46.dp+dfs解决两点概率连续性问题 (牛客联系赛114kevin的抽奖黑幕)
47.种类并查集维护敌对关系(cf805E) 种类并查集的作用就是不让两个有敌对关系的人在同一个队伍
48.快速幂+快速乘:主要解决大数相乘取模,如两个1e18的数相乘,模数也是1e18级别的,就算取模,还是会爆long long(牛客小白月赛12 - B - 快速幂+快速乘)
49.(矩阵快速幂)n长度数字和为m的倍数 湖南大学第十四届ACM程序设计新生杯(重现赛)L-The Digits String
50.区间翻转(平衡树板子 algo),k短路打印路径,路径距离板子(algo)
51.分数规划推导基本过程+拓扑排序最长路(1到n的边的价值和/花费和最大)(atcoder324 F)
注意
1.fr(i,0,n-1)->for(int i=1;i<n;i++) //-1会报错
2.数据范围
- vector<vector<int>>mp(n+2,vector<int>(m+2,0));
4.sort(v.begin(),v.end()),若已经指定了vector<int>v的数据范围,全部排序,
可以auto start=v.begin(),auto end=start+n;sort(start,end)
5二维mapmap<string,map<string,int>>jiyi;
- priority_queue<pr>q; //按第一位从大到小
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;//按第一位从小到大
7.set<int>s;s.erase(s.find(a[i]));
8.set的最小值*s.begin(),最大值*--s.end()
- sort(c[i],c[i]+3,[&](int x,int y){return b[x]<b[y];});
10.注意不能取余后比大小或使用min,max
11.清空注意范围(n,m)
12.map.find()函数:在容器中寻找值为k的元素,返回该元素的迭代器。否则,返回map.end()。
13.四、减法运算取模 由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
(A - B) % mod = ((A % mod) - (B % mod) +mod) % mod
14.vector<vector<int>>e; e.resize(n+1);
15.y/(x1*x2*x3*x4)的形式变为y/x1/x2/x3/x4的形式
16.最大公约数,最大公倍数逆推的改变(式子改变-->P1072[NOIP2009 提高组] Hankson 的趣味题)
17.y1不能定义在函数外
18.二分不带多余模板和定义,越简单越好
19.sort(v.begin(),v.end(),greater<int>()); //从大到小 sort(v.begin(),v.end(),greater<pr>()); //从大到小
20.不足前补0 prinf("%02d"),用0前补足2位,
21.eps,小数二分保留几位小数
性质
一.树的直径性质(树上任意两节点之间最长的简单路径即为树的「直径」。边权为负数不具备以下性质)
1.树的直径端点为两个叶子节点
2.距离树的任意节点的最远的端点为树的直径两个端点之一(867,903F)
3.若一棵树存在多条直径,那么这些直径交于一点且交点是这些直径的中点
4.对于两棵树,如果第一棵树直径两端点为(u,v),第二棵树直径两端点为(x,y),用一条边将两棵树连接,新树的直径一定是u,v,x,y,中的两个点
树的直径用于解决任意点点相距最远的距离
二.基环树(树的基础上加一边使之成环)
1.基环内向树:每个点都有且只有一个出度,并且环外的节点方向指向环内。
常用词义
product 乘 even 偶数
decimal 十进制
contiguous 连续的 palindrome 回文
plane 平面
bottom 底部 excluding 除了
coincide 相交,重叠
grid 网格
parameters 参数
denote 标志 tuple of three 三元组 extracting 选取
bonus 额外的 exceed 超过 consecutively 连续的
square 平方 permutation排列
constraints 约束