NOIP 2024 游记 & 赛前训练总结

NOIP 2024 游记 & 赛前训练

前面都是比赛前的训练,会含有一些比赛经验。游记写在最后。

day #-18(11.11)

赛时

今天做信友错的模拟赛。

第一题是和最短路有关的,看到 n500 就想到了 n3logn,然而看了很久都不会做,于是果断火速打了 O(n4) 的暴力走人,get 50pts。

然后看第二题,发现是最大异或路径,正好最近刚学了线性基,于是想到之前做的一道线性基的题目,把每个环加入线性基。然后就能做到 n2,再补一个树的性质。get 55pts。此时比赛刚过一小时。

很快啊,其他人还在做 T1,我就开了 T3。看了一会想到用并查集维护,再记录修改前的以实现撤销。发现大样例都过了,此时我还以为复杂度是正确的,此时比赛刚刚过半。但是去了一下洗手间,就想到可以构造一条链卡到平方,这个做法只能过随机的性质和不撤销的性质。于是又补了链的性质。get 55pts。

此时光靠暴力已经得到 160pts 了。

比赛刚过半,看了一下第四题,觉得还是要先补一下第一题的性质,补了一个性质 A,多得了 10pts。

这时我去尝试想中间两道题的正解,无获,于是开始打最后一题的暴力。

后半程有点松弛。

发现暴力分很多啊,在最后 20 分钟写完了 n9 的 40pts 暴力,然后又补了前两个性质共 8pts。

赛后 & 总结

然后——比赛结束,最后一题 48pts 60pts,最后总分 50+55+55+60=230 喜提总榜 14,jz 第 3,原来是暴力场。

赛后发现 T1 是线段树分治的思想,还有 Floyd 插入单个点的技巧,我们只以一个点集内的点为中转点转移(插入顺序没有要求),就可以求出只经过(不包括起点终点)这个点集内的点的最短路。

T2 是线性基的结论,qmax(ij)=qmax(i)qmin(j)

T3 是树剖+线段树的 4K 大数据结构,就是把轻链的贡献全部挂在重链上,有点类似动态 DP 那种。

T4 是论文题,用结论的式子计数。而暴力就是递归,然后在递归过程中进行剪枝就能跑得比较快。

总结:这场比赛时间分配还不错,前面暴力打得比较快,调试也没花多少时间,大概是经验越来越丰富了吧。但可惜后面充裕的时间内没有想出正解,其实正解是不难的,还有提升空间。

改题经验

改 T3 的时候有一个数组没开 long long,幸好很快就查出来了。

改 T1 的时候在分治时把枚举 [l,mid] 写成 [1,mid] 了。

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 我自信地认为 n3×V 不会爆 long long,导致我没有取模。

而 T4 不知道为什么 O(n3) 没有拿到第二档分,tm 的 OI 赛制还绑 subtask。

赛后

T2 是对于长度相同的区间的线段树是同构的,运用这个性质记忆化递归

T3 题面很简单,正解是神奇哈希,被骗啦,哈哈哈,把 shi 题放在 T3 让人以为是科技题。大概是把 n 个位置用哈希值转化成 个字符的不同情况。

T4 是分治,矩形分为跨过分界线和不跨过两种,不跨过是子问题,递归求解;跨过可以暴力做。每次对当前矩形割长的一边,这样复杂度就正确了,时间是 T(n)=4T(n/2)+O(n2)=n2logn

总结

  • 要有耐心,要充分利用时间。
  • 要注意数据范围,记得取模,不要想当然。
  • 神奇的题要想想神奇的算法,比如哈希之类的,这又让我想起星战那道奇葩题。

dsy #-9(11.20)

心有错。

赛时

T1 想到二分答案,然后就不会做了,我都要以为是罚坐场了。

前面浪费了一个小时,然后去开 T2,写了一个 O(n2) 暴力,对着边权讨论一下,然后终于想到了用线段树模拟最短路的过程,写完已经十一点了。

后面的时间打了剩下三题的暴力,这时感觉 T4 有点像哈希,但是觉得敲不出来了,就没继续想。

赛后

发现 T1 是我不会证的结论(猜结论题),T3 是 SG 函数的规律(打表题),T4 真的是哈希。

之后新学了博弈论相关的知识。

总结

  • 这场比赛在第一题浪费太多时间了,应该猜到题目不按难度排列的,一定要先做擅长的题和有想法的题。

day #-4(11.25)

今天的题都挺好的,但就是我没做出来几道,感觉思维不够敏捷了?这一周一定要努力了。

今天还是做心有错,T1 浪费了我一个半小时,T2 已经接近正解了,T3 用了错解结果过了,T4 其实不算难题但我没看。

T1

TAG:线性筛、质因数分解、最优化分解。

这道题很容易想到 O(Tnklnnk) 的做法,就是当 k=3 时,质数分解到 220,之后枚举所有质数即可。

然后我就绞尽脑汁没想到正解,但我想到和正解很接近的思路:
发现有很多小的质数对答案没有贡献,那怎么去掉它们呢?

然后我并不知道怎么去掉它们,原来只需要把 nk+1 的质数筛掉,剩下的最多是三个质数相乘,这个时候直接把剩下的 n 开根即可,时间复杂度 O(Tnk+1),由于 k 随机所以可过。

细节:我们需要用 powl(n,(long double)1/K) 进行开根,但由于指数是小数,所以还是有精度问题,我们还需要 roundl 进行四舍五入。

T2

TAG:逆序对、二维平面、扫描线。

这题我比赛时想到了:
如果选 i,j(i<j),那么答案为 1+2k=i+1j[ai>ak>aj]

赛时写了一个严格 O(n2) 的做法,就是预处理 fi,j 表示前 i 个数中 ai 大于 j 的个数。

赛时还想到放到二维平面上,把每个位置看成一个点 (i,ai),那么就是求一个矩形内点最多有多少个,要满足矩形左上角和右下角是一个点。

赛时觉得左上角应该是一个上凸包,右下角是一个下凸包,然后时间不够了,也没有再深度思考。

而实际上左上角是前缀最大值,右下角是后缀最小值。

发现我们枚举点对 (i,j) 不好统计,而且点对也是 O(n2) 的。

考虑 (k,ak) 对那些 (i,j) 有贡献。

发现满足条件的 i 是一个区间 j 也是一个区间,记它们为 [l1,k,r1,k],[l2,k,r2,k]

那么再把它放到二维平面上,就是 x=[l1,k,r1,k],y=[l2,k,r2,k] 的一个矩形内的点有 +1 的贡献。

那么线段树扫描线找到被最多矩形覆盖的点即可。

把一个矩形 [l1,k,r1,k],[l2,k,r2,k],分为 (l1,k,r1,k,l2,k,1)(l1,k,r1,k,r2,k+1,1) 即可。

T3

TAG:最小生成树、Prim、Kruskal、线段树、均摊、启发式合并。

做法 1

考虑 Kruskal。

把点按点权重标号,然后用 vector 和并查集维护每一个连通块内的点与每个点属于哪一个连通块,set 维护当前每个不同的连通块编号。

对于给的边就直接加;对于剩下的边,我们每次尝试向一个不同连通块内的点连边,失败次数是 O(m) 的,成功次数是 O(n) 的,于是均摊复杂度就是正确的。

合并 vector 需要启发式合并。

时间复杂度 O((n+m)logn)

考场上想到了均摊,但是没想到如何维护不同的连通块,但是写了一个相似的可以被卡掉的做法,但结果过了。

做法2

考虑 Prim,也就是每次找离连通块内最近的点加入连通块。

可以用线段树维护离连通块的距离与取出一个最近的点。

更新距离时,所有点的更新被给定的边分成了 O(m+n) 个区间赋 ai

时间复杂度 O((n+m)logn)

T4

发现取带权重心最优。

这题是动态寻找带权重心,用倍增找。然后权值和需要用较复杂的容斥,需要预处理多个树上 DP 数组,同时还需要换根 DP。

用到的算法并不难,一些结论也大概能猜到,就是在计算上的细节比较多。

总结

  • 题目难度不一定顺序,不要花太多时间在看起来很简单的题上。
  • 正难则反,多从不同角度思考问题。
  • 多从学过的算法中找思路和灵感。
  • 使用 powl 时,记得用 ruondl,记得用 long double
  • 可以尝试把序列上的统计问题放到二维平面上思考。
  • 统计 x 有多少个 y 时,可以考虑对于每个 y 思考它能贡献到哪些 x
  • 可以用线段树扫描线做最多覆盖问题,用差分做矩形的扫描线。
  • 用启发式合并合并 setvector 等。
  • 最短路、最近点可以考虑放到线段树上优化更新和取点。
  • 树上问题多考虑考虑重心或直径,从中寻找性质。

day #-3(11.26)

P1445 [Violet] 樱花

下午做了这一道奇葩的蓝题,我想了一个小时都不会做。

题意大概是给定 n,1n106,问 1/x+1/y=1/(n!) 的正整数解的个数。

大概是这样的:

xn!+yn!=xy

x(yn!)=yn!

x=yn!yn!

于是可以得到 y>n!,那么设 y=n!+kk 是正整数。

带入得

x=n!2+kn!k

x=n!2k+n!

于是对于任意 k 满足 kn!2,都有对应的一个 x,也就有对应的一组 (x,y)

于是答案就是 d(n!2),考虑枚举每个质数 p 的倍数,计算 p 在每个数中的指数和,记为 cntp,答案就是 p(cntp+1)

时间复杂度为 O(nlnn)

day #-2(11.27)

今天挂了 90 pts!!!

原因是 T1 在本地过了大样例后没造大数据,也没写对拍,于是最终的代码数组越界,然而测大样例时数组越界在 windows 下还能正常跑!
以后一定要造大数据或者在虚拟机上跑,windows 不可信。


今天做信友队。

T1

TAG:容斥、枚举。

T1 考虑如果两个点集有交,那么交的部分就减去,枚举一个点,再枚举两个有交点集所在的位置,给它们打上一个减去的标记,这部分是 O(nmk2)

然后枚举两个点集计算答案,这部分是 O(n2m2)

于是时间和空间都是 108 级别。

T2

TAG:随机化、调整法。

sb 出题人把 sb 脑电波题放在 T2,全场没人过。

题目大意:对于一个 nn 的方阵,每个格子是 0/1,方案数定义为不经过 0 每次往下或往右,从左上角走到右下角的方案数。求构造一个方案数为 Ln30 的方阵。

这道题是随机化,然而 sb 题解并没有证明,代码也很好打,就是调整法,每次贪心地调整最大的,多随机几次初始矩阵就可以通过。

T3

TAG:背包、增量构造、多项式、递推。

这题是好题。

题目大意:给你 nm 列数字,每行选一个数,求在所有选择方案中选出的数的中位数的期望。

赛时做法

考虑枚举最后的中位数 x,然后计算中位数为 x 的方案数,考虑背包设 fi,j,k 表示前 i 行选了 j 个小于 xk 个等于 x 的方案数。

由于 k 上界的和为 O(nm) 于是复杂度为 O(n3m)

我真的不懂为什么 O(n4)O(n5) 都一样只有 20pts,但愿正式赛会好一点。


然后我就想怎么优化,发现这样求方案数的话,不同中位数之间是没有关联的。

考虑求中位数小于等于 x 的方案数 ansx,于是等于的就是 ansxansx1

中位数小于等于 x 的方案数就要求至少有 n+12 行选的数要小于等于 x,发现这只与每一行小于等于 x 的数的个数有关。

然后我就不会了,觉得这个东西还是需要背包。

正解

我们考虑可以把背包刻画成多项式的形式,如果我们要求中位数小于等于 x 的,设 cnti为第 i 行小于等于 x 的个数,那么就有 ansx=[xn+12]F(x)=[xn+12]i=1n[(mcnti)+cntix]

考虑把所有 a 排序后依次加入 cnt 中,这样就能算出每个 xansx

考虑加入第 i 行的 a 后多项式怎么变化,考虑到有 O(nm) 个数,我们只需 O(n) 暴力修改多项式即可。

初始时 F(x)=mn

然后 cnticnti+1,我们可以先除以再乘上。

先考虑乘上,如果我们乘上 (a+bx),那么设 fii 次项系数,则

f0=af0

fi=afi+bfi1

移项后就能得到除法的式子,如果我们除以 (a+bx),则

f0=f0a

fi=fibfi1a

发现乘法要从大往小做,除法要从小往大做。

T4

TAG:期望、DP、高斯消元。

这道题鉴定为没有使用过高斯消元做期望问题,现在会了。

part 1

先判断无解的,对 O(n2) 个点建图,从能出去的点跑搜索看哪些点出不去。

part 2

对所有 (i,v),|v|n 的点取出来,建边然后跑高斯消元,时间为 O(n6)

part 3

发现如果 v>O(n) 那么前面已经走了 O(n) 距离,已经走出去了,于是只需要 |v|O(n) 的点。

时间复杂度为 O((nn)3)=O(n4.5)

part 4

再优化点数,考虑把一个点的期望表示成 fi=C+jai,jfjC 是常数。如果可以那么就能做到 O(n3)

考虑计算从 (i,0) 开始,对于每一个 j 中间不经过其他 (x,0) 到达 (j,0)期望步数、概率,以及直接走出去的期望步数、概率
这里的期望步数求的是已经乘过概率的,比方说设 qi 表示起点走到它的概率,ci 表示起点走到它的期望步数(没有乘上 qi 的)、我们求的实际上是 qi,Ci(Ci=qici),因为 ci 是不好转移的。
而且我们最后算的也是乘上概率后的期望步数和,即 Ci 的和。

举例:
1122,1123
就有:
c2=c3=1,q2=q3=12,C2=C3=12

而就有转移,设 pi 为走过出边的概率:

qi=qjpj

Ci=qi+Cjpj

发现对于 j<i,一定始终有 v<0,对于 j>i 一定始终有 v>0,即转移的图是一个 DAG。

于是便可以 DP,这一部分是 O(n3)

最后就表示成了,设 C 表示直接走出去的期望步数,fi=jqi,jfj+C+jCi,j

移项得 fi+jqi,jfj=CjCi,j,高斯消元 O(n3)

高斯消元的时候直接把无解的行列全变成 0 即可。

总结

  • 一定要写对拍、造大数据、在虚拟机上过编译。
  • 背包的转移可以尝试刻画成多项式的形式。
  • 期望问题可以高斯消元,高斯消元可以尝试优化点数,可以用 DP 先处理出特殊点之间的关系以尝试优化点数。

day #-1

今天做线下模拟赛,同样的,去实际考场断网做比赛。

今天打的非常好,没有挂分,100+100+80+30=310,获得了前 10 名。

赛时

今天是顺序开题,先看 T1,想到在上一次的生成树上改,似乎是经典结论:在树上加一条边后会形成一个环,把环上最大的边取走就可以得到新的生成树,我写的是 O(n2logn+qn) 但实际上可以用 Prim 做到 O(n2+nq),评测时也是 800ms 惊险地卡过了。
发现有的人 O(n2logn+qnlogn) 被卡了、还有人 450002 MLE 了。

T2 很 sb 但还是惊险地过了。发现数据随机,想到是神奇的做法。
一开始想到类似某次 ABC 的 G 题那样,查询枚举子集、修改再枚举子集,数据随机可以做到 O(n+3m),但没有优化前景。
然后又打表发现后面的询问的答案都非常小,于是考虑每次从小到大枚举修改的位数,然后发现它跑得飞快,大约 500ms。
其实这个做法和 bfs 搜索是本质相同的,复杂度或许可以证明是正确的,大概就是因为本质是 m 维空间的最小曼哈顿距离,空间中的点一定会越来越密集,所以跟数据随机并没有什么关系。

打完前题大概是 9:30,比赛是 7:30 开始的,经过 2h 了,速度中规中矩。

T3 经过我艰辛的打表,终于发现了 A 性质的充要条件,我也没有证明,但它对了。

获得 80 pts 后其实还剩一个多小时,但我想先去看 T4。

T4 想到网络流,但是并没有这一档分,想着多骗一点,结果打完了发现建模错了,或许根本不能网络流。
只剩半小时了,赶快去写指数级别的暴力,写完后还剩十多分钟了。

后面就是放到虚拟机上过编译了一下。

其实我知道 T3 的正解和 A 性质仅差一步之遥,但就亏在 T4 把时间浪费在错解上了,或许也是前面的题花的时间过多了。

而且 T3 的表的规律或许只是运气好,其他人都是考虑放到二维平面上考虑然后得到相同的结论。

赛后

T3 就是在 A 性质上扩展一下,还是 DP 考虑最终序列。

考虑除了第一段的每一段的结尾,它不能是一个隐藏的数,否则这一位填 0 以后和它不能区分,而每一段的除了结尾的位置则可以是隐藏的数。

再考虑每一段最大值的限制,它和第一段有关,如果第一段的结尾是一个隐藏的数,那么如果后面没有出现过最大值,那么无法与第一段的结尾为其它数的序列区分。也就是如果第一段的结尾为隐藏的数,那么后面一定要出现最大值。

那么就设 fi,j,0/1 表示第 i 位填了 j,有没有出现过最大值。
j 等于 0 时,那么上一个数为一段的结尾,就要求上一个数不能隐藏。

总结

  • 写完代码要注意优化常数,看清数据范围。
  • 最小生成树可以使用 PrimKruskal。稠密图 Prim 优为 O(n2),稀疏图 Kruskal 优为 O(mlogm+α(n))
    Prim 可以用优先队列做到 O(mlogm)
  • 打表找规律,但不要找无意义的规律,不要在这方面浪费太多时间。
  • 尝试画图,把数值放到二维平面上或许能很快得到结论。
  • 求经过若干操作得到最终序列有多少个,一般问什么就从什么方向考虑,即直接求最终序列满足的条件,用 DP 等构造最终序列。
  • 写网络流一定要建模正确,不然假了写这么长的网络流就太浪费时间了。

day #0

最后一天!计划是刷一些题练一下手感,然后复习一些算法,看一下写过的总结。

arc176_c Max Permutation

题目大意:求有多少个排列,满足 m 个限制形如 max(Pai,Pbi)=ci

这一题的 max(Pa,Pb)=c 其实就是要求 a,b 其中一个等于 c,另一个小于 c

我们把它当做一条边 (a,b,c)
有一些确定点权的方法:

  • 如果有多个边权相同的边,首先它们必须有一个公共点,不然无解。然后这个公共点一定取这个边权。
  • 如果我们已经确定 (u,v,w)u 的点权 valuvaluw,则 valv=w
  • 考虑如果一个点 u 有多条边,那么这个点的值要小于等于所有边权的最小值 M
    那么对于其它边权大于 M 的边 (u,v,w)valu 就不能等于 w 了,则 valv 的值就确定为 w 了。

我们可以跑 dfs 完成上述过程。

之后剩下的边没有公共点,只有两种情况:

  • 有一个点已确定。
  • 两个点都没确定。

对于第二种情况可以钦定其中一个点等于边权,答案数乘 2,就转化成了第一种情况。

那么现在的问题就是每个点 x,要小于一个权值 vx

枚举权值 i,设 vx=i 的点有 cnt 个,小于 i 的位置中还空了 s 个,则答案乘上 (scnt),预处理阶乘即可。

最后有一些没有边的点,记它为 c 个,答案还要乘上 c!

时间复杂度 O(nlogV+mlogm),去掉排序和用线性逆元可做到 O(n+m)

abc181_f Silver Woods

考虑到答案具有单调性,于是二分答案。

考虑一个半径为 r 的圆能从 (xA,yA),(xB,yB) 之间经过,要满足 2r(xAxB)2+(yAyB)2

那么我们就想如果不满足,就说明半径为 r 的圆心不能跨过线段 AB

我们把不能跨过的点连起来,同时连上上边界和下边界。
此时 r 可行当且仅当上边界和下边界不连通,可以用并查集处理连通块。

时间复杂度 O(n2α(n)logV)

注意事项

策略方面:

  • 不要死磕,扔掉了就不要有后顾之忧。
  • 如果没有什么好入手的题目,那么先打暴力
  • 打表找规律,但不要找无意义的规律,不要在这方面浪费太多时间。
  • 题目难度不一定顺序,不要花太多时间在看起来很简单的题上,思考大于 30min 你就要考虑扔掉它了
  • 要有耐心,不要因为前面的题不会,后面就不去想了。
  • 麻烦你想清楚再写,不要写假做法

技术方面:

  • 写完代码要注意优化常数,看清数据范围。
  • 一定要写对拍、造大数据、在虚拟机上过编译。
  • 使用 powl 时,记得用 ruondl,记得用 long double

算法方面:

(一些最近写的算法)

  • Floyd 插入单个点技巧、线性基结论、轻链挂重链维护信息。
  • 记忆化递归、字符串哈希、子问题分治。
  • 质因数分解、扫描线、最小生成树、带权重心。
  • SG 函数、打表找规律。
  • 线段树优化 MST、最短路。
  • 容斥、随机化、调整法、多项式、高斯消元。
  • DP 求方案数。

(思考方向)

  • 神奇的题要想想神奇的算法,比如哈希之类的。
  • 统计 x 有多少个 y 时,可以考虑对于每个 y 思考它能贡献到哪些 x
  • 启发式合并合并 setvector 等。
  • 树上问题多考虑考虑重心或直径
  • 背包的转移可以尝试刻画成多项式的形式
  • 期望问题可以高斯消元,高斯消元可以尝试优化点数,可以用 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,我开始考虑一段的方案数,发现不好统计,想到正难则反,考虑用总数减去不合法的方案数,就是一段全部连起来,然后最后不相等,大概就是

Vlen×(V1)

然后再考虑前后的方案数,发现可以随便取,这是因为 V2,所以必定有一种方案可以避免受到限制。

我觉得第二题甚至比第一题简单,大概在 9:30 过了 T2。

这时比赛还剩三个半小时,我想这次的比赛应该很简单了吧?想着后两题还能再拿 100 pts。

这时看 T3 和 T4,决定先想 T4。首先把大于等于理解为等于,然后看 O(nQ) 的档,枚举长为 k 的区间。
首先想到一段区间的 LCA 怎么求,不就是每次加一个点求 LCA 吗,这个东西可以在线段树上合并 LCA,但是这样是 O(log2n) 的。
想到优化求 LCA,先预处理所有点对的 LCA 又不太好做,最后终于想到在欧拉序上 O(1) 求 LCA,发现线段树也可以扔掉了,可以区间 O(1) 最值求最小最大欧拉序。现在这一部分是严格 O(nQ),加上性质有 32pts。

我想去想链的性质,然而不会维护区间内最长连续段,无果。
最终在挣扎了浪费了一段时间后,觉得这题做不出来了。

转而去做 T3,开始我错误地认为枚举顺序对应一种生成树,把 O(nK) DP 写完后才发现错了,原来是忘记了同构的树。

然后改了一下转移,转移还更简单了。

fi=son!×fj

我以为就这样而已,结果发现第二个样例过不了,发现初始边不同时树也有可能同构。

我就开始苦思冥想,想到不枚举关键边了,考虑怎样的树能满足。
发现对于一个点连向的所有边,对于这些边连起来的链,只有链首尾两条边对应的子树内能放关键点。

想到了一个 O(n2logn)O(n3) 的暴力,就是考虑取出一条首尾为叶子,路径上包含关键点的路径,然后挂在路径上的贡献也可以 DP 求,链本身可以倍增或枚举链上的点。

然而此时已经 12:00 了,我意识到不能再想了,今天后两题肯定没希望了。首先觉得 T4 暴力更好打,果断先打 T4 的暴力,最终在 12:30 获得了 T4 的 32pts。

还能冲 T3!发现做法细节太多了,终于在最后 10min 我放弃了,交了 K=1 的暴力,获得 24pts。

然后就是检查,也没时间去虚拟机上测了,就在 windows 上测吧。

最终估分 100+100+24+32=256

赛后

出考场发现大家也不会后两题,但部分分比我高一点,f**j 是 288,大家快膜拜他。

而且发现 T3 其实有一个链的性质我没写,能白拿 4pts 的。

又要回去学文化课了。

总结

  • 我已经尽力了,就是可能没有把所有时间用来冲更高的暴力分,而是花了很多时间去想正解。
  • 这次比赛中,转题策略比较果断,很好地避免了基本能拿的暴力分没拿到而爆 0 的情况。
  • 也有不足之处,检查不够充分,还不确定是否会挂分,不过大概率是不会了。后面也没有预留时间去虚拟机上测了,今天也没有去对拍。
  • 可惜就是尽管前两题切得很快,但后面的暴力分还是不够高,或许还是因为经过了一些无意义的思考,浪费了一些时间。

The End

祝大家不要挂分,祝我自己不要挂分。

Finished on 2024-11-30。

Update on 2024-12-06,出分了,跟估的一样。

posted @   dengchengyu  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示