1.时间安排
6:00-6:20
看完T1,意识到是个模拟水题,光速码完,并与手推数据对照,确认没问题看T2。
6:20-6:40
看到了T2的70%数据很简单,光速码完暴力,然后思考很久AC做法没思路,去看T3。
6:40-7:00
看到数据需要离散化,第一遍的思路是暴力+离散化,光速码完,然后祈祷数据水,去看T4。
7:00-7:30
看了10分钟没思路,就去检查前面的代码有没有低级错误,手捏的一些数据测试,确定暴力分没问题,继续看T4。
7:30-9:00
发现暴力似乎不可解,试图打表,也很困难,就进行手推(n=5一共42种子图qwq),虽然推了快半个小时但成功得出了两个结论中的一个,然而没有发现分母的关系,无缘AC。
9:00-9:30
回过头看T3,发现有60%的数据可以用树状数组解,光速码完,测试没问题,回头想T2。
9:30-10:00
始终没想到T2正解,T4也没有进展,无奈提交。
2.赛后反思
1.策略的问题
前三题的时间还算合理,但在T4上花的时间太久了,差不多两个小时,但终究还是爆0。
更合适的,应该把更多的时间留在T2这样正解并不是很难就能想到的题,或者是进行对拍检查。
目前的策略:先把最简单的题码完,难一点的先码送分数据,更难的送分数据也没有思路就先不做,把前面能拿的分拿到更多,回过头再考虑这些难题。
2.观察力的问题
T2实际上就是二分查找和树状数组区间求和单点查询,但赛场上都没有看出来,反而是T3只用一个前缀和数组就能拿的60分却用了更麻烦的树状数组。T4的分母推出前5个后,没有发现是卡特兰序列。
没有看出二分的单调特性还是粗心了,但数论这类题确实做的比较少,没有看到题就能直接意识的考察的是什么的思维,码代码也没有手感,还需要参考标程。这种数论,尤其是推算规律的题还是需要多练。
3.算法的问题
T3涉及到了从未学过的算法:分块(莫队)。这是一种类似于树状数组和线段树的数据结构。
既然是刚学的算法,最近就要加强练习,分块的思想不难代码也比较容易实现,所以要尽量练会这类型题。
4.心态的问题
在做到T4时,因为做到了不会的题,心态有点乱,好在调整的比较好,没有太大影响。但这并不能说明这种见到难题就心乱的心态没有影响(@某冰雪小屋),这并不是个比赛的好习惯。
见到难题,第一时间不应该想别人拿高分,我做不出来,这样只会影响自己发挥。应该想的是自己用什么办法,能让自己拿高分。线上赛场没有现实赛场那种压迫感,这种心态不及时改,将来在赛场上肯定吃亏。
不需要去想别人发挥如何,就把比赛当做平常的练习,没必要想没做出来会怎么样,而是去想怎么样用学过的东西拿高分。赛场是残酷的,所以不得不让自己为思考中心,专注自己的发挥,忽视对手,才能保证正常的发挥,不报遗憾。
3.题解
T1.数列
题意:
输出外观数列(
1
≤
n
≤
25
1\leq n\leq 25
1≤n≤25)。
n=1 1
n=2 11 (1个1)
n=3 21 (2个1)
n=4 1211 (1个2,1个1)
……
题解:
这是一道纯模拟题,各种方法都可以,甚至可以手推数列打表(建议数据加强)。
赛场上用了递归,用字符串储存答案,按照规则扫描上一个字符串得到这一个的答案。要注意的是扫描到字符串结尾要进行特判。
T2.索引
题意:
定义索引:若存在 i i i使得 a [ i ] = = i a[i]==i a[i]==i,则称 i i i为序列 a a a的一个索引。
给定一个 n n n项单调递增的序列,先判断是否存在索引,再在保证序列仍然单调递增的情况下进行 k − 1 k-1 k−1次区间修改,询问此时是否存在索引。
范围:
n ≤ 1 e 7 , k ≤ 1 e 3 n\leq 1e7,k\leq 1e3 n≤1e7,k≤1e3
其中70%的数据满足 n ∗ k ≤ 1 e 8 n * k\leq 1e8 n∗k≤1e8
题解:
对于70%的数据可以用暴力更新扫描的方式,但这样显然不能AC。
正解:树状数组+二分查找
注意到本题的特殊条件修改完的序列仍然单调递增,因此满足了二分的前提条件:单调性。用二分可以使查找的复杂度降为O( log n \log n logn)。
考虑修改,可以用树状数组优化,进行区间修改,单点查询的操作,复杂度同样降为O( log n \log n logn)。就可以AC了。
可以发现,大多数的二分都具有一个重要的特点:单调性。所以,如果必须进行遍历的查找,如果序列具有严格的单调性,可以优先考虑二分来降低复杂度。
T3.奇数
题意:
给定一个n项的数组,进行q次查询:给定区间[l,r],询问该区间有几个出现奇数次的数
范围:
30%的数据满足:
1
≤
N
≤
1
e
3
,
1
≤
Q
≤
1
e
3
,
1
≤
a
i
≤
10
1\leq N\leq 1e3,1\leq Q\leq 1e3,1\leq ai\leq 10
1≤N≤1e3,1≤Q≤1e3,1≤ai≤10
30%的数据满足:
1
≤
N
≤
1
e
5
,
1
≤
Q
≤
1
e
5
,
1
≤
a
i
≤
10
1\leq N\leq 1e5,1\leq Q\leq 1e5,1\leq ai\leq 10
1≤N≤1e5,1≤Q≤1e5,1≤ai≤10
20%的数据满足:
1
≤
N
≤
1
e
5
,
1
≤
Q
≤
1
e
5
,
1
≤
a
i
≤
1
e
5
1\leq N\leq 1e5,1\leq Q\leq 1e5,1\leq ai\leq 1e5
1≤N≤1e5,1≤Q≤1e5,1≤ai≤1e5
20%的数据满足:
1
≤
N
≤
1
e
5
,
1
≤
Q
≤
1
e
5
,
−
1
e
9
≤
a
i
≤
1
e
9
1\leq N\leq 1e5,1\leq Q\leq 1e5,−1e9\leq ai\leq1e9
1≤N≤1e5,1≤Q≤1e5,−1e9≤ai≤1e9
题解:
对于第一档的数据,直接暴力查找。对于前两档数据,可以采用前缀和。因为数组大小有限,这些方法不可能AC。
正解:分块,莫队
考虑到没有修改的操作,可以把所有的询问先储存起来,排序,再离线求解。
每次询问,只需要暴力移动当前已选中区间的左右端点,这样复杂度最坏只有O( n n n\sqrt n nn)
T4.解谜
题意:
给定n个点( n ≤ 1 0 9 n\leq10^9 n≤109),这n个点能构成的所有二叉树种类数 f [ n ] f[n] f[n],所有可能的二叉树的子节点的个数和 g [ n ] g[n] g[n]。
求 g [ n ] f [ n ] m o d 2148473647 \frac{g[n]}{f[n]}mod 2148473647 f[n]g[n]mod2148473647的值
题解:
实际上, g [ n ] = f [ n − 1 ] ∗ n g[n]=f[n-1]*n g[n]=f[n−1]∗n,这是因为,对于上一个状态的所有二叉树,在不出现重复的情况下,在某个叶节点上新增一个叶节点,那么这时的二叉树叶节点数量不变,并且一共有n种添加方式,合起来就是上式(在赛场上想出来的,和题解不太一样,但显然是正确的)。
然后通过打表发现, f [ n ] f[n] f[n]正是卡特兰序列的第 n n n项。
经过化简,答案就是 n ( n + 1 ) 2 ( 2 n − 1 ) \frac{n(n+1)}{2(2n-1)} 2(2n−1)n(n+1),再用快速幂进行分数取模运算就AC了。
所有考点
T1:模拟
T2:二分+树状数组
T3:分块,莫队
T4:递推,卡特兰数,分数取模
4.未来规划
1.巩固数论的知识。
毕竟当时一股脑学了一大堆东西却没怎么练,已经忘了差不多了(数论只会gcd)。而且一些常识性的数论知识要熟记,比如质数,欧拉函数,卡特兰数,赛场上肯定不让翻算阶。
2.刷分块的题目。
刚刚学的新知识,不抓紧巩固,就要溜走了qwq。
3.找一些二分的题目分析。
二分题目的特征很多,但有时候会隐藏在一些不起眼的地方被忽视,并且经常和其他的知识点结合起来考察。在一些暴力算法中,二分也可以达到少量的优化来拿到更多的分数。可以尝试总结一下这类题的特征和分析方法。
4.与同学交流,丰富解题策略
像lyc,bcy大佬经常拿到神犇级别的分数,除了码力,他们肯定也有更优的比赛策略。虽然培养码力很重要,但我觉得更好的策略比码力更重要。策略不对,码力再好也发挥不出来。