NOIP 2024 游记 & 赛前训练总结
NOIP 2024 游记 & 赛前训练
前面都是比赛前的训练,会含有一些比赛经验。游记写在最后。
day #-18(11.11)
赛时
今天做信友错的模拟赛。
第一题是和最短路有关的,看到
然后看第二题,发现是最大异或路径,正好最近刚学了线性基,于是想到之前做的一道线性基的题目,把每个环加入线性基。然后就能做到
很快啊,其他人还在做 T1,我就开了 T3。看了一会想到用并查集维护,再记录修改前的以实现撤销。发现大样例都过了,此时我还以为复杂度是正确的,此时比赛刚刚过半。但是去了一下洗手间,就想到可以构造一条链卡到平方,这个做法只能过随机的性质和不撤销的性质。于是又补了链的性质。get 55pts。
此时光靠暴力已经得到 160pts 了。
比赛刚过半,看了一下第四题,觉得还是要先补一下第一题的性质,补了一个性质 A,多得了 10pts。
这时我去尝试想中间两道题的正解,无获,于是开始打最后一题的暴力。
后半程有点松弛。
发现暴力分很多啊,在最后 20 分钟写完了
赛后 & 总结
然后——比赛结束,最后一题 48pts
赛后发现 T1 是线段树分治的思想,还有 Floyd 插入单个点的技巧,我们只以一个点集内的点为中转点转移(插入顺序没有要求),就可以求出只经过(不包括起点终点)这个点集内的点的最短路。
T2 是线性基的结论,
T3 是树剖+线段树的 4K 大数据结构,就是把轻链的贡献全部挂在重链上,有点类似动态 DP 那种。
T4 是论文题,用结论的式子计数。而暴力就是递归,然后在递归过程中进行剪枝就能跑得比较快。
总结:这场比赛时间分配还不错,前面暴力打得比较快,调试也没花多少时间,大概是经验越来越丰富了吧。但可惜后面充裕的时间内没有想出正解,其实正解是不难的,还有提升空间。
改题经验
改 T3 的时候有一个数组没开 long long
,幸好很快就查出来了。
改 T1 的时候在分治时把枚举
day #-14(11.15)
今天输了!
20:35 开始打 CF div.2。
顺序开题。
T1 是唐题,T2 是唐题。
T3 我蠢了,1 h 时还没过,于是去写 T4。
T4 也想了不少时间,终于想到一个用 set+BIT 的做法。
T5 是树同构,我还以为要换根于是没写。
T6 是交互,没看。
最后成果:T1+T2+T4。
赛后发现 T3 的正解就是我想的那样,结果 tm 的 T5 的同构是有根树下的,又被骗了。
谴责 CF 的题面跟 shi 一样长。
总结:
- 要有耐心,不要因为前面的题不会,后面就不去想了。
- 不要花太多时间在一道题目上,扔掉后就不要再去想它了。
day #-13(11.16)
今天又做心有错。
T1 简单题。
后面都不会做,把暴力都拿了。
预计:100+60+60+50=260。
实际:72+60+60+20=212。
T1 我自信地认为 long long
,导致我没有取模。
而 T4 不知道为什么
赛后
T2 是对于长度相同的区间的线段树是同构的,运用这个性质记忆化递归。
T3 题面很简单,正解是神奇哈希,被骗啦,哈哈哈,把 shi 题放在 T3 让人以为是科技题。大概是把
T4 是分治,矩形分为跨过分界线和不跨过两种,不跨过是子问题,递归求解;跨过可以暴力做。每次对当前矩形割长的一边,这样复杂度就正确了,时间是
总结
- 要有耐心,要充分利用时间。
- 要注意数据范围,记得取模,不要想当然。
- 神奇的题要想想神奇的算法,比如哈希之类的,这又让我想起星战那道奇葩题。
dsy #-9(11.20)
心有错。
赛时
T1 想到二分答案,然后就不会做了,我都要以为是罚坐场了。
前面浪费了一个小时,然后去开 T2,写了一个
后面的时间打了剩下三题的暴力,这时感觉 T4 有点像哈希,但是觉得敲不出来了,就没继续想。
赛后
发现 T1 是我不会证的结论(猜结论题),T3 是 SG 函数的规律(打表题),T4 真的是哈希。
之后新学了博弈论相关的知识。
总结
- 这场比赛在第一题浪费太多时间了,应该猜到题目不按难度排列的,一定要先做擅长的题和有想法的题。
day #-4(11.25)
今天的题都挺好的,但就是我没做出来几道,感觉思维不够敏捷了?这一周一定要努力了。
今天还是做心有错,T1 浪费了我一个半小时,T2 已经接近正解了,T3 用了错解结果过了,T4 其实不算难题但我没看。
T1
TAG:线性筛、质因数分解、最优化分解。
这道题很容易想到
然后我就绞尽脑汁没想到正解,但我想到和正解很接近的思路:
发现有很多小的质数对答案没有贡献,那怎么去掉它们呢?
然后我并不知道怎么去掉它们,原来只需要把
细节:我们需要用 powl(n,(long double)1/K)
进行开根,但由于指数是小数,所以还是有精度问题,我们还需要 roundl
进行四舍五入。
T2
TAG:逆序对、二维平面、扫描线。
这题我比赛时想到了:
如果选
赛时写了一个严格
赛时还想到放到二维平面上,把每个位置看成一个点
赛时觉得左上角应该是一个上凸包,右下角是一个下凸包,然后时间不够了,也没有再深度思考。
而实际上左上角是前缀最大值,右下角是后缀最小值。
发现我们枚举点对
考虑
发现满足条件的
那么再把它放到二维平面上,就是
那么线段树扫描线找到被最多矩形覆盖的点即可。
把一个矩形
T3
TAG:最小生成树、Prim、Kruskal、线段树、均摊、启发式合并。
做法 1
考虑 Kruskal。
把点按点权重标号,然后用 vector
和并查集维护每一个连通块内的点与每个点属于哪一个连通块,set
维护当前每个不同的连通块编号。
对于给的边就直接加;对于剩下的边,我们每次尝试向一个不同连通块内的点连边,失败次数是
合并 vector
需要启发式合并。
时间复杂度
考场上想到了均摊,但是没想到如何维护不同的连通块,但是写了一个相似的可以被卡掉的做法,但结果过了。
做法2
考虑 Prim,也就是每次找离连通块内最近的点加入连通块。
可以用线段树维护离连通块的距离与取出一个最近的点。
更新距离时,所有点的更新被给定的边分成了
时间复杂度
T4
发现取带权重心最优。
这题是动态寻找带权重心,用倍增找。然后权值和需要用较复杂的容斥,需要预处理多个树上 DP 数组,同时还需要换根 DP。
用到的算法并不难,一些结论也大概能猜到,就是在计算上的细节比较多。
总结
- 题目难度不一定顺序,不要花太多时间在看起来很简单的题上。
- 正难则反,多从不同角度思考问题。
- 多从学过的算法中找思路和灵感。
- 使用
powl
时,记得用ruondl
,记得用long double
。 - 可以尝试把序列上的统计问题放到二维平面上思考。
- 统计
有多少个 时,可以考虑对于每个 思考它能贡献到哪些 。 - 可以用线段树扫描线做最多覆盖问题,用差分做矩形的扫描线。
- 用启发式合并合并
set
,vector
等。 - 最短路、最近点可以考虑放到线段树上优化更新和取点。
- 树上问题多考虑考虑重心或直径,从中寻找性质。
day #-3(11.26)
P1445 [Violet] 樱花
下午做了这一道奇葩的蓝题,我想了一个小时都不会做。
题意大概是给定
大概是这样的:
于是可以得到
带入得
于是对于任意
于是答案就是
时间复杂度为
day #-2(11.27)
今天挂了 90 pts!!!
原因是 T1 在本地过了大样例后没造大数据,也没写对拍,于是最终的代码数组越界,然而测大样例时数组越界在 windows 下还能正常跑!
以后一定要造大数据或者在虚拟机上跑,windows 不可信。
今天做信友队。
T1
TAG:容斥、枚举。
T1 考虑如果两个点集有交,那么交的部分就减去,枚举一个点,再枚举两个有交点集所在的位置,给它们打上一个减去的标记,这部分是
然后枚举两个点集计算答案,这部分是
于是时间和空间都是
T2
TAG:随机化、调整法。
sb 出题人把 sb 脑电波题放在 T2,全场没人过。
题目大意:对于一个
这道题是随机化,然而 sb 题解并没有证明,代码也很好打,就是调整法,每次贪心地调整最大的,多随机几次初始矩阵就可以通过。
T3
TAG:背包、增量构造、多项式、递推。
这题是好题。
题目大意:给你
赛时做法
考虑枚举最后的中位数
由于
我真的不懂为什么
然后我就想怎么优化,发现这样求方案数的话,不同中位数之间是没有关联的。
考虑求中位数小于等于
中位数小于等于
然后我就不会了,觉得这个东西还是需要背包。
正解
我们考虑可以把背包刻画成多项式的形式,如果我们要求中位数小于等于
考虑把所有
考虑加入第
初始时
然后
先考虑乘上,如果我们乘上
移项后就能得到除法的式子,如果我们除以
发现乘法要从大往小做,除法要从小往大做。
T4
TAG:期望、DP、高斯消元。
这道题鉴定为没有使用过高斯消元做期望问题,现在会了。
part 1
先判断无解的,对
part 2
对所有
part 3
发现如果
时间复杂度为
part 4
再优化点数,考虑把一个点的期望表示成
考虑计算从
这里的期望步数求的是已经乘过概率的,比方说设
而且我们最后算的也是乘上概率后的期望步数和,即
举例:
就有:
而就有转移,设
发现对于
于是便可以 DP,这一部分是
最后就表示成了,设
移项得
高斯消元的时候直接把无解的行列全变成 0 即可。
总结
- 一定要写对拍、造大数据、在虚拟机上过编译。
- 背包的转移可以尝试刻画成多项式的形式。
- 期望问题可以高斯消元,高斯消元可以尝试优化点数,可以用 DP 先处理出特殊点之间的关系以尝试优化点数。
day #-1
今天做线下模拟赛,同样的,去实际考场断网做比赛。
今天打的非常好,没有挂分,
赛时
今天是顺序开题,先看 T1,想到在上一次的生成树上改,似乎是经典结论:在树上加一条边后会形成一个环,把环上最大的边取走就可以得到新的生成树,我写的是
发现有的人
T2 很 sb 但还是惊险地过了。发现数据随机,想到是神奇的做法。
一开始想到类似某次 ABC 的 G 题那样,查询枚举子集、修改再枚举子集,数据随机可以做到
然后又打表发现后面的询问的答案都非常小,于是考虑每次从小到大枚举修改的位数,然后发现它跑得飞快,大约 500ms。
其实这个做法和 bfs 搜索是本质相同的,复杂度或许可以证明是正确的,大概就是因为本质是
打完前题大概是
T3 经过我艰辛的打表,终于发现了
获得 80 pts 后其实还剩一个多小时,但我想先去看 T4。
T4 想到网络流,但是并没有这一档分,想着多骗一点,结果打完了发现建模错了,或许根本不能网络流。
只剩半小时了,赶快去写指数级别的暴力,写完后还剩十多分钟了。
后面就是放到虚拟机上过编译了一下。
其实我知道 T3 的正解和
而且 T3 的表的规律或许只是运气好,其他人都是考虑放到二维平面上考虑然后得到相同的结论。
赛后
T3 就是在 A 性质上扩展一下,还是 DP 考虑最终序列。
考虑除了第一段的每一段的结尾,它不能是一个隐藏的数,否则这一位填 0 以后和它不能区分,而每一段的除了结尾的位置则可以是隐藏的数。
再考虑每一段最大值的限制,它和第一段有关,如果第一段的结尾是一个隐藏的数,那么如果后面没有出现过最大值,那么无法与第一段的结尾为其它数的序列区分。也就是如果第一段的结尾为隐藏的数,那么后面一定要出现最大值。
那么就设
当
总结
- 写完代码要注意优化常数,看清数据范围。
- 最小生成树可以使用
或 。稠密图 优为 ,稀疏图 优为 。
可以用优先队列做到 。 - 打表找规律,但不要找无意义的规律,不要在这方面浪费太多时间。
- 尝试画图,把数值放到二维平面上或许能很快得到结论。
- 求经过若干操作得到最终序列有多少个,一般问什么就从什么方向考虑,即直接求最终序列满足的条件,用 DP 等构造最终序列。
- 写网络流一定要建模正确,不然假了写这么长的网络流就太浪费时间了。
day #0
最后一天!计划是刷一些题练一下手感,然后复习一些算法,看一下写过的总结。
arc176_c Max Permutation
题目大意:求有多少个排列,满足
这一题的
我们把它当做一条边
有一些确定点权的方法:
- 如果有多个边权相同的边,首先它们必须有一个公共点,不然无解。然后这个公共点一定取这个边权。
- 如果我们已经确定
中 的点权 且 ,则 。 - 考虑如果一个点
有多条边,那么这个点的值要小于等于所有边权的最小值 。
那么对于其它边权大于 的边 , 就不能等于 了,则 的值就确定为 了。
我们可以跑 dfs 完成上述过程。
之后剩下的边没有公共点,只有两种情况:
- 有一个点已确定。
- 两个点都没确定。
对于第二种情况可以钦定其中一个点等于边权,答案数乘 2,就转化成了第一种情况。
那么现在的问题就是每个点
枚举权值
最后有一些没有边的点,记它为
时间复杂度
abc181_f Silver Woods
考虑到答案具有单调性,于是二分答案。
考虑一个半径为
那么我们就想如果不满足,就说明半径为
我们把不能跨过的点连起来,同时连上上边界和下边界。
此时
时间复杂度
注意事项
策略方面:
- 不要死磕,扔掉了就不要有后顾之忧。
- 如果没有什么好入手的题目,那么先打暴力。
- 打表找规律,但不要找无意义的规律,不要在这方面浪费太多时间。
- 题目难度不一定顺序,不要花太多时间在看起来很简单的题上,思考大于 30min 你就要考虑扔掉它了。
- 要有耐心,不要因为前面的题不会,后面就不去想了。
- 麻烦你想清楚再写,不要写假做法。
技术方面:
- 写完代码要注意优化常数,看清数据范围。
- 一定要写对拍、造大数据、在虚拟机上过编译。
- 使用
powl
时,记得用ruondl
,记得用long double
。
算法方面:
(一些最近写的算法)
- Floyd 插入单个点技巧、线性基结论、轻链挂重链维护信息。
- 记忆化递归、字符串哈希、子问题分治。
- 质因数分解、扫描线、最小生成树、带权重心。
- SG 函数、打表找规律。
- 线段树优化 MST、最短路。
- 容斥、随机化、调整法、多项式、高斯消元。
- DP 求方案数。
(思考方向)
- 神奇的题要想想神奇的算法,比如哈希之类的。
- 统计
有多少个 时,可以考虑对于每个 思考它能贡献到哪些 。 - 用启发式合并合并
set
,vector
等。 - 树上问题多考虑考虑重心或直径。
- 背包的转移可以尝试刻画成多项式的形式。
- 期望问题可以高斯消元,高斯消元可以尝试优化点数,可以用 DP 先处理出特殊点之间的关系以尝试优化点数。
- 写网络流一定要建模正确,不然假了写这么长的网络流就太浪费时间了。
- 计数问题,先从限制紧的条件入手。
- 可以考虑建图。也可以考虑从数值角度分析。尝试画图,把数值放到二维平面上或许能很快得到结论。
代码方面:
- 注意要开
-std=c++14 -Wall -Wextra
。 - 注意不能以
j0,j1,jn,y0,y1,yn
为变量名,其在<cmath>
中有定义。 - 注意不要使用
prev,next,begin,end
等指针操作函数作为变量名。 - 注意快读要判符号。
- 注意要开
long long
,要及时取模。 - 注意不要把
l,mid
写成1,mid
。 - 注意变量名不要重复。
- 注意变量名不要记错、写错。
- 注意变量要赋初值。
- 注意数组不要越界,数组不要开小,字符串结尾有
\0
。 - 注意不要空间超限。
STL 方法等:
vector.resize(size); vector.back(); vector.front(); bitset.count(); bitset.set(); //set to true bitset.reset(); //set to false bitset._Find_first(); bitset._Find_next(pos); chrono::system_clock::now().time_since_epoch().count(); chrono::steady_clock::now(); chrono::duration<double>;
编译选项:
-fsanitize=address -fsanitize=undefined -Wall -Wextra -std=c++14 -g -Wl,--stack=128000000 ulimit -s 1024000
The End:
- 不要贬低自己,不要考虑他人。
- 以平常心对待。
NOIP RP++!!!
day #1 NOIP2024
赛前
由于是在本校考,早上七点半才到教室,教练还贴心地给我们带了早餐。
赛前写了一下快读快写模版,没有复习别的东西,然后带了一瓶东方树叶就进考场了。
赛时
8:15 进考场,进考场感觉有点小慌,这怎么和前几天模拟赛的电脑配置不一样,显示器小小一个,然后发现键盘也是旧键盘,我已经开始担心键盘打不动了。
8:27 开始,还是照惯例密码没发下来,于是开始打头文件和快读快写,配置了一下 IDE 和编译选项,建了文件夹,我用的是 dev-cpp,由于编译器是重新配置过的 winlibs GCC 13.2.0,所以还挺好用的。
不出我所料,发现了键盘的 ctrl 非常硬。
8:34 开始看 T1 和 T2,决定先开 T1。发现 T1 竟然不是水题,很快就感受到了一种贪心策略,觉得没有什么问题。
就是先把所有固定的和不固定的匹配,然后再贪心地匹配上下都不固定的,能选就选,因为失配的贡献和匹配的贡献都是 1,所以是对的。
大样例调了一个小错误:要到一个位置再开始删它。
然后造了一个大数据,也没有验证答案,没有 RE 就自信觉得过了。
大概在 9:00 把 T1 扔掉了。
然后开始看 T2,我开始考虑一段的方案数,发现不好统计,想到正难则反,考虑用总数减去不合法的方案数,就是一段全部连起来,然后最后不相等,大概就是
然后再考虑前后的方案数,发现可以随便取,这是因为
我觉得第二题甚至比第一题简单,大概在 9:30 过了 T2。
这时比赛还剩三个半小时,我想这次的比赛应该很简单了吧?想着后两题还能再拿 100 pts。
这时看 T3 和 T4,决定先想 T4。首先把大于等于理解为等于,然后看
首先想到一段区间的 LCA 怎么求,不就是每次加一个点求 LCA 吗,这个东西可以在线段树上合并 LCA,但是这样是
想到优化求 LCA,先预处理所有点对的 LCA 又不太好做,最后终于想到在欧拉序上
我想去想链的性质,然而不会维护区间内最长连续段,无果。
最终在挣扎了浪费了一段时间后,觉得这题做不出来了。
转而去做 T3,开始我错误地认为枚举顺序对应一种生成树,把
然后改了一下转移,转移还更简单了。
我以为就这样而已,结果发现第二个样例过不了,发现初始边不同时树也有可能同构。
我就开始苦思冥想,想到不枚举关键边了,考虑怎样的树能满足。
发现对于一个点连向的所有边,对于这些边连起来的链,只有链首尾两条边对应的子树内能放关键点。
想到了一个
然而此时已经 12:00 了,我意识到不能再想了,今天后两题肯定没希望了。首先觉得 T4 暴力更好打,果断先打 T4 的暴力,最终在 12:30 获得了 T4 的 32pts。
还能冲 T3!发现做法细节太多了,终于在最后 10min 我放弃了,交了
然后就是检查,也没时间去虚拟机上测了,就在 windows 上测吧。
最终估分
赛后
出考场发现大家也不会后两题,但部分分比我高一点,f**j 是
而且发现 T3 其实有一个链的性质我没写,能白拿 4pts 的。
又要回去学文化课了。
总结
- 我已经尽力了,就是可能没有把所有时间用来冲更高的暴力分,而是花了很多时间去想正解。
- 这次比赛中,转题策略比较果断,很好地避免了基本能拿的暴力分没拿到而爆 0 的情况。
- 也有不足之处,检查不够充分,还不确定是否会挂分,不过大概率是不会了。后面也没有预留时间去虚拟机上测了,今天也没有去对拍。
- 可惜就是尽管前两题切得很快,但后面的暴力分还是不够高,或许还是因为经过了一些无意义的思考,浪费了一些时间。
The End
祝大家不要挂分,祝我自己不要挂分。
Finished on 2024-11-30。
Update on 2024-12-06,出分了,跟估的一样。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探