随便写一写 emm...

╄→尐↘猪︶ㄣ 提交于 2020-10-24 16:17:46

1.正向问题难以解决可以反过来倒着解决。

2.注意数组大小问题,没有空间限制的时候最好开到数据上限,有利于骗分,万一暴力有点优秀呢(* ^ ▽ ^ *)。

3.多个变量防止搞混,例如结构体里和外面的。

4.做题前先考虑什么条件是无用的,显然可以转化或者“压缩”的条件就不用考虑那么麻烦了。

5.矩阵乘法记得初始化矩阵。

6.如果求前几大或前几小,但是不容易求出所有情况,从一种情况到另一种情况的转移是有序的,那么可以用优先队列先存下一部分,依次向后有序推。

7.遇到和gcd、lcm有关的以及质数合数可以想一想是否能分解质因数,可以考虑一个范围内的质数个数和题目有什么关系。

8.如果数字不是特别大,可以考虑将最大的质因数扔出来,先考虑较小的质因数。

9.数字很大并且有乘除可以考虑是不是能够用取对数的方法,转化一下。

10.对于构造问题,多想特殊情况,例如它让差为几的时候可以让一个为0,再构造一个刚好为那个差的情况。(和也类似)。也可以考虑从一个点推到另外一个点会发生什么变化,依次递推出答案。

11.如果有范围限制可以考虑k维偏序,或者用树状数组线段树限制一下,如果一个限制是有序的,可以在枚举时实现从而少考虑一个限制。

12.看到字符串想一想SAM或者trie什么的,对于SAM可以dfs遍历求出所有子串。

13.如果一条边的边权给定了一个范围但没有给实际值,那么可以考虑差分约束解决问题。

14.半径为\(\sqrt n\)的圆经过的整点数个数为\(4*\sum_{d | R} X(d), X(d) = 1 (d\mod 4 == 1), X(d) = -1 | (d\mod 4 == 3), X(d) = 0 | (d\mod 2 == 0)\)

15.当要求两两之间...,例如两两之间的距离和的时候,可以考虑每个数或者每条边的贡献,例如两两之间距离和,就可以考虑每条边的贡献(一侧点数 * 另一侧点数 * val)。

16.循环节一定是长度的约数;如果n是一个循环节,那么k*n也必定是一个循环节(关键所在);n是[l,r]这一段的循环节的充要条件是[l,r-n]和[l+n,r]相同(利用这个性质我们在判断是否为循环节是可以做到O(1))。

17.当一个变量有两种选择时,考虑是不是能够2-sat求解。

18.遇到二进制运算时想想可不可以拆位,进一步简化问题。

19.如果在\(01\)方格中想维护全部为某一个值的所有矩形时,可以维护每个格子向上最大的该值的个数,然后每一行用单调栈维护。

20.如果在树上而且需要求某个节点编号或者权值有倍数关系的点的贡献或者质数的贡献,可以考虑枚举gcd并对所有是他的倍数的点建虚树来求解。

21.如果让求权值为类似0-n的形式的所有方案数,可以考虑NTT或者FFT,如果是在树上,可以考虑换根。

22.相邻的两个整数、相邻的两个奇数互质,可以利用一下这个性质。

23.如果让维护序列中每一个区间的贡献,可以考虑线段树维护,考虑固定一个端点快速得出其他点为另一个端点时怎么更改贡献,如果让维护平方,可以考虑额外维护一个区间和。

24.用flag判断,如果有了合法的flag=1,让函数返回时除了进入某一个点时判断,对于一个点枚举的延伸出去的情况也要判断,使其停止。

25.如果需要统计该子树外的贡献,可以先dfs维护子树内的一些信息,然后看看是否可以再dfs一次,利用那些已知的信息,从父亲向儿子递推子树外的贡献。

26.遇到绝对值可以分类讨论绝对值里面的东西为正还是为负,划分成两个定义域求贡献。

27.时间为坐标、坐标问题,想区间dp。

28.如果题目涉及到第k大/小(k可以为1)的求和(例所有区间的求和)可以考虑用链表或者并查集维护删数。

29.没啥思路想想dp和组合数。

30.括号序列上dp转移时可以考虑记忆化搜索,每次进入一个!合法的子序列区间!(可用栈维护配对的两个点),当\(r=l+1\)时即可停止。

31.询问多个区间可以想一下莫队。

32.动态维护一个点到某些点的距离和以及动态维护一个点到一个区间的最小距离(一个点会变化)可以想一下动态点分治。
动态维护可以想一下离线倒序或者动态点分治或者DDP。大规模处理树上路径,我们经常会对整棵树进行分治。

33.在线询问一个区间内比某个数大或小通常用主席树。

34.若一个数是大于2的质数,那么前提条件是他是一个奇数。

35.多次询问一些区间的某些信息(如逆序对)时,若强制在线,可以考虑分块,以每一块的左端为左端点处理出右端点一直移动到n的所有贡献,然后查询时左边的残块单独考虑,右边的直接加即可。

36.数据范围不是很大时可以想一下网络流,当两点之间互相匹配时可以二分图或网络流。

37.当dp维度过多时可以考虑是否能将某一维不作为状态而作为dp的含义,以及是否可以将某一维滚动掉。

38.存在欧拉回路的条件是图中不存在度数为奇数的点。求n个点连通图或者有条件的连通图(例:欧拉图(每个点度数为偶数的连通图))个数(f函数)时可以容斥,用随便连的方案数(g函数)-不联通的,i个点的不联通的图求法经常是枚举一个与1点相连的大小为j的连通块,方案数为C(i-1,j-1),然后利用之前求得的f[j]乘上剩下的i-j个随便连的g[i-j]即可,依次枚举并减去。i个点的每个点度数为偶数的图方案数为ksm(2,C(i-1,2))(前i-1个点随便连,最后用i来平衡度数(让所有度数为奇数的点向i连边就好,因为度数为奇数的点一定是成对存在的))。

39.对于一道题看一下数据范围,可以对范围较小的那个进行维护降低复杂度。

40.线段树开4倍空间,一定要多加检查。

41.处理a! / b!可以处理每个质因子个数,而每个质因子的出现个数即为a!中它的出现次数减去b!中的,可以维护前缀和,因为对于a!,出现个数为1中的+2中的+...+a中的。

42.注意点的编号是从0到n-1还是从1到n。

43.好多问题可以分别考虑每一个数的贡献最后加起来以求解。

44.a+b=2*(a&b)+(a^b)。

45.高斯消元当项数不多时可以尝试手动高斯消元简化一下O(n^3)的算法。

46.对于构造问题怎么特殊先怎么想,例如构造树的话可以想想链、二叉树、菊花图啥的。

47.对于dp转移,如果不会优化可以考虑能不能将转移方程式拆成几个好维护的部分,例如可将(i-j)^2拆开。

48.期望的和等于和的期望。

49.求最大值可以将数值排序后从小到大加入,那么当前加入的一定是目前的最大值,最小值同理。求最大值最小值也可以用st表快速求出区间的最大最小值。

50.当每个元素作用相同或相似时,dp下标也可以用某个状态的元素个数来表示。

51.用并查集维护时如果有撤销操作,那么不能路径压缩,普通返回即可。

52.防止变量冲突,例如有二分时会用到r,那么变量定义时就不要使用r。

53.重载等于号不能传两个参,传一个参然后返回当前指针即可。

54.对于交换后求逆序对数期望的问题可以dp,设dp[i][j]表示位置i的数字<位置j的数字的概率,对于交换(x,y)如果他有1/2的几率发生,那么f[x][i] = (f[x][i] + f[y][i]) / 2。

55.求总的贡献可以用期望*总方案数。

56.前缀gcd只有log种取值。

57.让你判断能不能到某个点 -> 给该点赋值inf,求最大值是不是>=inf。

58.一个地图有宝藏有陷阱,不能碰陷阱的条件下获得的宝藏最多:把陷阱改为权值-inf的宝藏后求最大值。

59.树上路径期望问题可以把每个节点的dp值表示 a×f(fa)+b的形式。

60.重复一样的操作很多次,可以尝试快速幂/倍增。

61.可以通过二分答案将一个较难直接求解的问题转化为判定性问题。

62.最小不相交路径覆盖:总点数-最大匹配,最小可相交路径覆盖:先floyd传递闭包,然后将合法的边连上,总点数-最大匹配。

63.最大独立集=总点数-最大匹配。最大匹配=最小覆盖集。

64.看到需要求字符串成功匹配的次数想AC自动机。

65.若一条边一定在最大匹配中,那么先用网络流跑最大匹配,这条边一定满足1.有流量流过,2.边的两端点不能在一个环中。

66.对于一个偶数,a^(a+1)=1。

67.如果每条边都有一定的代价而且和网络流相关,考虑费用流。

68.记得打表,打完表一定要输出!。。。

69.凸多边形算面积的时候令所有点减去一个点(随意一个点)变成一个向量,然后相邻向量叉积即可。

70.不知道怎么做题的时候可以考虑一下贪心,大胆猜想即可,反正也不会,能骗一点是一点(手动笑哭)。

71.对于中间元素会对两边相邻元素产生影响的题,可以考虑将过程逆过来,然后分治递归即可。

72.不能用exit(0),函数如果没有返回值一定不能定义成int型的,否则一定出锅!!!定义不是void型一定要返回!!!

73.计算概率要正着算,计算期望要倒着算。

74.对于序列上让求k段不相交连续子段的和的最大值或者树上让求k条不相交链的和的最大值,可以贪心,每次选取最大子段或者直径,并将选取的数字取反,操作k次即可。

75.中途输出一定要删除,否则就错了!!!!!!

76.关于卡特兰数,h[0] = h[1] = 1, h[i] = h[0] * h[i - 1] + h[1] * h[i - 2] + ... + h[i - 1] * h[0]。
同时也可以用C(2 * n, n) / (n + 1)来表示。
n个点可以构成的二叉树个数可以用卡特兰数来表示。其他多种应用,请实时自行搜索。

77.最小费用可行流只需要像有源汇有上下界可行流一样,首先t->s连(inf,0),建一个超级源节点和一个超级汇节点,依旧计算出du[i],若du[i]>0则与s连边,否则与t连边。

78.如果遇到内向基环树(每个点只有一个入度),可以考虑先思考链上怎么处理,然后将环上的部分单独考虑一下,用类似的或者单独的方法处理一下即可。
如果是在树上选一些边而且每个点只能利用一次,那么可以dp,在每个点处考虑是否选择这个点,如果选择,将其与他的一个儿子连在一起即可。

79.如果不会某个题可以考虑写完基础暴力之后随机化骗一些分。

80.如果写if else尤其是多个的时候一定要注意哪个if连着哪个else,带上大括号防止连接错误。

81.\(\sum_{i = 1} ^ {n} ​i * Fib_i ​= n * Fib_{n + 2} ​− Fib_{n + 3} ​+ 2\)
\(f[1]^2+f[2]^2+...+f[n]^2=f[n]*f[n + 1]\)

82.斐波那契数列相关的问题可以想一下循环节或者规律或者矩阵乘法。

83.切记少用map!!!

84.WQS二分可以把dp状态里的个数限制转化出来,表示成目前选的个数最后判断一下是否合法,可以实现降维。

85.考试最后一定要检查一遍是否MLE、RE之类的,顺带检查long long问题,算一下空间,如果显然没分不用开那么大,否则可以骗分。

86.如果在树上求一个点到其他所有点的距离的最大值,不用O(n^2),两次dfs就可以转移,一次从子树转移,一次从父亲转移。

87.把某些字符合并的题目似乎都有套路,就是确定消去的优先顺序然后用栈来维护消去的情况,最后用dp的状态来确定栈的情况。

88.处理树上路径问题一定要想点分治!!!

89.long double用%.xLf输出。

90.一定要注意变量名重复问题,尤其是有多个树的时候!!!

91.如果dfs用到了栈,回溯的时候如果当时弹出了某些东西记得记录一下然后压进去。

92.碰到gcd lcm相关的问题还有一个常用套路就是枚举gcd容斥之类的。

93.PAM若求每一个回文子串的出现次数需要让cnt[fail[x]]+=cnt[x],注意要倒序枚举。

94.优化dp的方法有很多,常用的有斜率优化,单调队列优化,wqs降维等等,记得想一想,尤其是斜率优化以及单调队列优化!

95.NTT求limit的时候是<=2*n。

96.做完题之后测一下大数据是不是会RE、TLE之类的,然后用文件输入输出一下。

97.一定要注意输出格式,比如是换行还是空格!!

98.加边的时候注意val的赋值。

99.写了函数一定要记得调用!!!

100.一定要注意模数是不是大于\(n\),记得\(Lucas\)啊T_T

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!