NOIP赛前总结

NOIP赛前总结

基础算法:

·(o)排序

·(?)贪心(注意每一次写拍,验证思想)

·(o)二分答案(注意边界,对拍验证,自己出极值)

·(o)逆序对(树状数组)

·(o)离散化(排序)

·(?)倍增(注意使用的范围和方法)

·(?)三分答案

 

数学问题:

·(o)公约数&公倍数

·(X)素数问题+莫比乌斯+欧拉函数(线筛板子)

·(o)gcd& ext_gcd(注意性质)

·(o)ksm&ksc

·(?)排列组合

·(X)高精度(背板子)

·(o)高斯消元

·(?)容斥原理

 

字符串:

·(o)KMP

·(X)扩展KMP

·(o)trie

·(o)最长公共字串

·(X)manacher (背板子)

·o)AC自动机

·(?)字符串hash(再多熟悉)

 

搜索算法:

·(o)dfs(注意剪枝)

·(o)bfs(扩展为可以到的点,进行遍历)

·(o)折半搜索(需要满足可并性质)

 

(X)动态规划(DP):

·(?)普通线性

·(X)区间型DP(这很难说啊······)

·(X)环形DP(完全不懂)

·(X)双路DP(感觉复杂度很高······)

·(?)树型DP(如果遇到了,直接当成推公式)

·o)背包问题

·(o)最长不下降系列(树状数组+离散化)

·(o)最大字段和(单调队列优化)

·(?)记忆化搜索(好处在于在打暴力的时候,可以尝试看一下是否可以记忆化,说不定可以多搞一个部分分)

·(X)状压DP(主要还是经验不够啊······)

·(o)滚动数组降维(只要是注意对于滚动数组的初始化)

·(o)单调性优化(deque实现,主要是注意形式的推导)

·(o)数位DP(注意空间的限制,尽量将没有用的状态删掉,而且如果状态数太多,数位DP也还是可能炸掉)

 

数据结构:

·(o)栈(直接stack,tarjan使用)

·(o)队列

·(?)链表(去学一下list)

·(o)二叉堆(优先队列直接上)

·(o)并查集(递归版本,判连通)

·(?)树的遍历(再看看)

·(o)树状数组

·(o)LCA(倍增+ST表)

·(o)RMQ(ST表)

·(o)线段树(各种区间查询,加减乘)

·(?)可持久化线段树(区间变动,权值线段树)

·(?)树链剖分 (再看一下模板,注意什么时候开边界)

·(?)主席树(动态区间处理)

图论:

·(o)图的遍历(建议bfs)

·(o)最短路径(dijkstra+堆/spfa/floyed)

·(o)第k短路(Astar直接来)

·(o)差分约束系统(注意边界问题)

·(o)最小生成树(建议prim+堆)

·(?)拓扑排序(再看模板)

·(o)tarjan(缩点+割边+强连通+双连通+割点)

·(?)网络流最大流/费用流(dinic再看模板)

·(o)匹配,最大匹配(匈牙利)

 

游戏策略:

·(?)Nim & Anti-Nim(注意常识,注意博弈的思想)

·(?)sg函数(dfs/打表)

 

题目错误&经验总结:

1、DP方程多推敲,多搞整,多降复杂度。

2、做除法和模运算时特判0

3、注意研究数据范围,不要强行增加复杂度

4、注意各种基础算法的变式

5、注意对于题目的逆向思考(逆向floyed,逆向并查集,逆向加边,拆点)

6、学会将具象化的结论,进行抽象的处理,(如将在同一集合之内的,抽象为图论的连通)

7、图论方面,注意反向边与补图的建立和利用

8、要注意对复杂度的判断,尽量保守,考试的时候,电脑不一定有这么好,控制在0.8*1e8左右,但也不要漏判。

9、网络流的dinic,嗯,复杂度很玄学,如果觉得有必要,直接上就好,不要觉得他的最坏复杂度高(建议当成n挂个log,虽然卡退化就炸)······

10、网络流难在建图,一般的见图方向有,将限制建在中间,两边无限制,或者是在两边放限制,中间不放限制,偶尔还有一些,将所有的点(边)分成几个部分然后分开处理,也有将点或边分拆成几个,再分别建立不同的边(点)的关系。建立超级原点,汇点。

11、数位DP注意边界判断,尽量省略不必要的状态,还有就是,可以将一些参数带着跑(比如mod)

12、注意在必要的时候给dp加上记忆化,加完再拍一拍。

13、容斥原理中的莫比乌斯在gcd==1时的使用。遇到质数啊,容斥啊,不要想了,线筛先要有。

14、必要的时候,打表找规律,然后再来拍一拍

15、bfs的时候,可以进行适当的状压,不然就成了dfs······

16、很多时候在图上面给你说什么,路径上的边权最小啊,边的权值互不相同什么的,一般是最小生成树。

17、最小生成树最后用prim+堆,kruscal的sort和并查集,嗯,有点玄。

18、可以通过给边加权,从而得到包含某一个集合的最小生成树。

19、莫队的迷之复杂度,谨慎使用

20、对于树上的处理,可以通过链剖,dfs序,节点的入栈出栈时间等来转化为序列操作。

21、树状数组的修改,注意,一定不能让传进去的坐标是0,不然,RE等着你······

22、注意遇到模运算,最后一步是(ans%mod+mod)%mod

23、对拍时,注意自己跑几组大数据,看一下会不会爆负,越界,死循等,并且记住srand(time(0))······

24、尽量预处理重复计算的东西。

25、字符串hash,双hash,都是大大的好

26、注意数据范围,必要就开long long如果只是过程计算,最好直接强转,long long的常数,嗯,你懂的。

27、组合数预处理:Cmn=Cm-1n-1+Cm-1n(记住隔板法求方案数)

28、线段树有时候需要下传为0的tag,可以考虑将所有的tag+1,或者全部初始化为-1

29、注意做题的取舍,先打暴力保底,正解如果实在想不到就先放弃,能拿的分一定要拿。

30、对于一个矩阵,要计算其中一个子矩阵,可以通过先O(n2)预处理每一个左上角为(0,0)的子矩阵,然后每一次O(1)计算。

31、Xor的套路:1、a xor b xor b=a,最大化,每一次找最相反的,(高低位贪心),最小化,每一次找最接近的(依然高低位贪心)。

32、有时候对于某一个点集建立超级点,可以降复杂度。

33、折半搜索+hash是好东西(注意可并性)

34、区间DP学会讨论,区间中最重要的,最显然的

35、数据量大:离散化orhashormap

36、遇加减,想gcd

37、要善于对暴力剪枝,说不定玄学复杂度就过了,(详情见谯老师)

38、注意处理高精度数据时,判断前导0,分离清空

39、注意在dp的时候数学计算顺序等······(不行加个拍)

40、Bfs注意状态的齐全,可以用bfs进行某些题目的状态推导

41、注意良好的代码风格,不然考试你别想调代码

42、压缩串后序列自动机,又一个DP套路

                             dp[a+1][b][c][nxt[i][0]]+=dp[a][b][c][i]

dp[a][b+1][c][nxt[i][1]]+=dp[a][b][c][i]

dp[a][b][c+1][nxt[i][2]]+=dp[a][b][c][i]

43、注意多维DP压常数

44、学长lcr:有良心的人不会卡spfa,但是出题人一般没有良心(注意:重点是后面(认真脸))

45、字符串如果你想进行比较:先比较长度,在直接用大小于符号比字典序,直接比,他会直接比较字典序

46、不要学某些人见到最短的最长就是二分,因题而异。

47、有时候如果状态数少,搜索+剪枝是能过的,不要经常误判复杂度。

48、倍增可以打ksm,详见Frog

49、三个数x,y,z互不相同,当且仅当x = 2k−1,z = 2k +2k−1, y =z−1异或为0(题解表示)

50、对于可能性极多的题,一定要写拍

51、可以通过dfs统计一条边两边的节点数,从而统计贡献

52、Toy结论题,记结论

53、乘法运算会爆掉long long的情况,可以转成对数的运算

54、如果出现题目的要求精度比较小的情况,可以通过,舍弃一个大数的尾数来使其不炸,long double也可以

55、乘法分配律······

56、滚动数组注意初始化

57、Tarjan注意判重边,注意判自环

58、不要试图给读入剪枝

经典dp有些时候只需要注意相对大小,如果只有大小于号限制:
fij=k=ji-1fi-1[k]

fij=k=1j-1fi-1[k]

59、对于哈夫曼树问题,可以选择加0来保证最优

60、注意又有除,又有模要求逆元

61、一个数x最多被有效地modO(log x)次。

 

弱点:

1、DP弱是硬伤······

2、对于有些写起来比较麻烦的算法有点逃避。

3、代码常数比较大·····(要压常)

4、思维分析能力还有点欠佳······

5、经验不够,做题量还要增大才行

6、虽然暴力写得多,但是在剪枝方面还很弱·····

7、对于算法的应用不够灵活,应该学会在模板的基础上,挖掘其作用,而不仅仅是会写。

 

 

你可能感兴趣的:(NOIP总结,OI算法总结)