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