CSP-S 2019策略分析
基本策略
- 一些去重的题可以考虑放到平面上,然后最后用扫描线直接算面积,从而达到去重的目的。
- 离散化
动态规划
这是一类非常需要注意的题,注意状态的设置以及思考优化方法,具体有:
时间优化:
- 前缀和
- 单调队列
- 斜率优化
- 数据结构
- 矩阵乘法
- *四边形不等式(出现几率不大)
空间优化:
- 去除无用状态
- 循环状态
模拟
这类题几乎没有思维难度,但是要考察对情况的考虑是否完全,需要重点考虑情况是否有残缺等。
考察代码实现能力。
数学
一般就是质数的性质和应用,线性筛法。
- 注意:线筛的应用很重要,可以线性求\(\phi(x)\)(线筛求欧拉函数)
排列组合以及其他计数方法。
加法原理和乘法原理
容斥原理:
容斥原理很重要,有时候要考虑如何计算使得容斥更优(即使得每次减去的不重复)这个思想很重要。
如JZOJ6403. 【NOIP2019模拟11.04】a
图论
- 最短路问题
- 特殊图(包括 树,拓扑图,二分图等)。
- *网络流(一般不考)
- 拓扑序往往很重要,很多关于无向图或者元素出现先后顺序的都可以用这个拓扑序的性质来做
对于树
树形DP,最小生成树。
- 序列和图的转换
- 序列和树之间的联系(最小生成树)
搜索
对于搜索题出的十分频繁,这种题需要有很好的优化搜索的功底,如
- 折半
- 剪枝
对于搜索题需要尽量拿多的分。
构造
构造类题目一般没有明确的算法,需要仔细分析题目的实质,并得出解法。
这个解法通常不是唯一的。
有时一个好的贪心可以得相当多的分。
有时搜索剪枝可以很大的提高效率。同样以多得分为目标。
需要很敏锐的数感。
分治
- 分治思想很重要,最典型的就是线段树
- 把问题转化为二维三维偏序,使用CDQ分治解决,如JZOJ6398. 【NOIP2018模拟10.30】Generator
贪心
这是最难的题型之一。
因为在不明白贪心的正确性的时候,是很难考虑用贪心的,而且证明正确性也也不容易。
所以这样一来需要对贪心的策略有很深的理解。
二分
这种方法是很重要的。
一般只要出现”即最大又最小“这样的字样,算法一定是二分+贪心或DP判定。
所以这就要有很敏锐的套路感知以及算法的熟练度
数据结构
①并查集
-
判断图的连通性
-
最小生成树/最大生成树
-
对具有相同性质的东西进行分类
-
如果想要知道 对于一个全图 删点之后 ,查询连通性,我们可以反过来搞,将删点转为加点,再查询连通性
-
在“回溯”的时候进行统计,->带权并查集
-
注意 数组的大小,(注意 是否 有离散化 <->数组大小)
-
注意 序列与图的玄学联系与转换 序列<->图
②线段树
这是个很重要的数据结构,需要熟练掌握它的用法。
- 处理区间最大最小值的时候用到。
- 处理修改以及查询的时候有可能用到。
- 要记住区间深度为log级别的,所以有些可能无法解决的东西其实在线段树上暴力即可。(例如区间取模,这利用每个数其实取模次数很少)
- *树链剖分里面使用
③树状数组
这东西在很多时候能够代替线段树,因为代码短,好打常数小。
也是维护区间和之类的。
- 二维偏序使用树状数组直接维护
- 三维偏序用到CDQ分治,排序后直接使用树状数组维护。
字符串
联赛算法KMP、trie等较简单的算法,一般不考察AC自动机、后缀自动机...
- KMP时间复杂度O(n),这点注意,利用nex数组的性质来做题。
- trie可以较方便地读入字符串免得用到hash这样误差大的东西
- 单模hash
- 双模hash
- hash思想可以用来做树的同构等。
- *manachar处理回文串
做题策略分析
首先要做好心理准备,知道自己定下的目标,然后理清自己的计划与思路。
不要太在意结果。法拉第说过一句话:“拼命去换取成功,但不希望一定会成功,结果往往会成功。”这就是成功的奥秘。
-
前一天晚上要早点睡觉,养好精神,保持清醒的大脑。
-
对于比赛,我们的目标是拿分,能够拿到满分当然最好,但是上手的第一步不应该直接想满分怎么做,而是尽可能地去得到最高的分。首先把能够写的部分分都写出来(对于你无法在短时间内切的题),然后确保能够拿到很多分的前提下再去思考、实现满分做法,这样能够更好地确保能够得到高分。
-
根据数据范围推测算法。
如果忽略直接模拟和贪心模拟和优秀模拟这几个算法的话,
\(N<=10:O(n!),全排列算法\)
\(N<=12:O(4^n) 状压,如Noip2017的宝藏就有这么做的\)
\(N<=18:O(3^n),状压,如一道叫obelisk的状压dp\)
\(N<=20:O(2^n),状压,应该不会考“是或不是”这种基础搜索法\)
\(N<=1e2: O(n^3),还可以带一点常数,Floyd或者dp\)
\(N<=1e3: O(n^2),dp,图论,\)
\(N<=1e4:这是在告诉你(n^2)很容易被卡。\)
\(N<=1e5:O(nlog_2n)),二分,数据结构,lca等(这个最常见了),log^2n也常见\)
\(N<=1e6..1e7:O(n) ,数学方法,贪心\)
\(N<=1e9: O(1),数学方法,贪心,或者不要考虑从N这里下手,或者用上我们的好帮手map。\)
各数据范围之间可能会串通,灵活考虑。 -
注意数组越界,需不需long long或高精度。
注意删掉无关输出。
注意读入有没有负数。
注意文件操作。(freopen) -
注意时间,不要做着做着忘记时间。
-
最后时刻:
不建议抢最后的分
先保证已写的不意外丢分 -
NOIP考场真经二十条
1、考前敲几个常考的算法模版,提高准确率,找到好状态。
2、考前试机时要测试编程软件是否正常,不要指望当天的监考老师能帮你解决。
3、进入考场后,敲入必须要写的代码,比如:头文件、main函数、文件读入与输出等。
4、理论上可以用bits/stdc++.h头文件,因为最后评测是在NOI Linux上进行的。如果考场仅提供Windows系统,做题时就需要注意了。
5、每年都有人因为提交文件的目录与命名规范爆零。要按要求建目录!按要求命名!目录结构不能错!文件后缀名不能错!大小写不能错!单词拼写不能错!
6、别人敲键盘很吵很快,别人一脸自信满满,别人在睡觉或玩游戏,不能说明他就是大佬,他只是看不惯你拿一等奖而已,别理他。
7、注意每道题的时间限制、空间限制、数据范围,不能想当然。
8、如果感觉题目很简单,要注意了!很多选手都是栽在简单题上!所以,对于简单的题,一定要考虑全面。不要想都不想就开始写,后来发现一些特殊数据要作特殊处理,改过来改过去,心情没了,一等奖就没了。
9、如果感觉题目很难,要注意了!你拿一等奖的机会来了!这时候大家比的是:谁能稳得住?谁能多拿分?谁想都不想就放弃了?
10、很多时候你是有能力做的,不要一看就怕了,没有认真想就去骗分。经验证明,很多题想到一定时候就会豁然开朗,并且很简单。经验多次证明,看起来很难的题往往很简单,看起来很容易的题往往都有坑。
11、多花点时间读懂题,不是浪费时间。绝大多数“边写边想”的人是拿不到多少分的,所以一定要真正读懂题,想好了算法,理清了思路再编写程序。
12、多花点时间静态查错,不是浪费时间。即使是大佬,每次静态查错都可以找到变量带错的错误。特别是快排的i,j是否带错,++,--是否搞错,循环变量出错等等。
13、多花点时间造测试数据,不是浪费时间。绝大多数没测试、没对拍的程序都不是正解,所以有时间不要胡思乱想,多测试!多测试!
14、最后,对于实在找不到正解的题,一定要骗分,一定要写小数据程序,输赢往往就在这10分、20分。
15、最后提交程序时,再次确认一下目录结构和文件名是不是符合要求,再次确认一下文件读入、输出、关闭是否符合要求。
16、认真读题!认真读题!积极思考!积极思考!
17、读懂了题目原意,再编程;写下来关键变量,再编程;搞清楚时空限制,再编程;搞清楚数据范围,再编程;理清楚算法思路,再编程;写下来关键语句,再编程。
18、编程后,查查变量对不对;编程后,看看样例过不过;编程后,造些数据试一试;编程后,对拍一下看一看。
19、先查编译错误,然后静态查错;先测样例数据,再测特殊数据。
20、谋事在人,成事在天。参与第一,拿奖第二。