NOIP训练赛#21

时间安排

7:40~8:55 :写完T1正解

9:00~9:20 :写完T2暴力

9:20~10:30 :想T2正解,没思路

10:30~11:00 :写T3暴力

11:00~11:30 :写T4 \(30pts\) ,但是分讨没讨全,挂了

11:30~11:40 :写T2的一档特殊数据

总结 :有限打完暴力,否则最后会时间不够写暴力,最后再想正解

题解

T1

超级源点 \(+\) \(dijkstra\)

T2

计数好题

设极长合法子串 \((i,j)\) 表示不可再向两边扩展的合法子串

设原序列一共有 \(cnt\) 个子串,每个子串中 \(1\) 的个数为 \(len\)

先不考虑算重的情况,则总方案数为 \(\sum_{x=1}^{cnt}C_{j_x-i_x+1}^{len}\)

考虑两段极长合法子串 \((l_1,r_1),(l_2,r_2)(l_1\leq l_2\leq r_1\leq r_2)\) ,则当变换区间包含 \((l_1,l_2)\)\((r_1,r_2)\) 时,两者方案一定不同(一个变了一个没变)
故答案减去 \(C_{r_1-l_2+1}^{len}\) 即可

复杂度 \(O(n^2)\) 考虑优化

考虑每次寻找区间内有 \(k\)\(1\) 的操作完全可以预处理 \(1\) 的位置( \(num\) 数组),然后每次的极长合法子串的下标即为 \((num_{i-1}+1,num_{i+k}-1)\) ,复杂度可优化为 \(O(n)\)

但是考虑每一次处理组合的时候会算重不变的情况,故要减 \(1\) ,然后去重的时候还需要加 \(1\) ,最后答案需要加 \(1\)

T3

\(dijkstra\) \(+\) 最短路径图好题

先对 \(S,U,V\) 三个点跑最短路

考虑 \(U\rightarrow V\) 的最短路和 \(S\rightarrow T\) 的最短路的交集一定是连续的(边权皆为正),那么可以 \(O(n^2)\) 枚举路径 \(P\rightarrow Q\) 并计算 $\min {\ dis_{S\rightarrow P}+dis_{Q\rightarrow V} }\ $

考虑优化,显然可以发现最短路径图构成了一张 \(DAG\) ,故设 \(f_x\) 表示 $\min{dis_{S\rightarrow P}}\ \(,\)g_x$ 表示 $\min{dis_{Q\rightarrow V}}\ $ ,扩展的时候判断当前点是否属于最短路径图即可( \(dis_{S\rightarrow v}+(v,x)=dis_{S\rightarrow x}\) )

T4

点分治好题

考虑答案有两种情况,一种是不动,另一种是逃跑到一个能最晚被抓住的点然后不动

考虑设 \(f_i\) 表示当 \(A\) 在点 \(i\) 时, \(B\) 抓住 \(A\) 的最短时间,先计算第一种情况(用 \(bfs\) 实现)

考虑计算第二种情况,可以用点分治来实现,考虑若 \(dep_x<f_x\) 时, \(A\)\(x\) 可以在 \(B\) 来之前逃跑,而能跑到的点则为深度为 \(f_x-dep_x-1\)(减 \(1\) 是减去当前根节点) 的所有节点,设 \(b_i\) 表示深度为 \(i\) 的节点被抓的最晚时间,故 \(b_i=\max(f_x)(f_x>dep_x\wedge f_x-dep_x-1=i)\)

最后对于 \(b\) 数组做一遍后缀和,然后用 \(b\) 数组更新所有深度为 \(i\) 的节点的答案即可

posted @ 2023-10-16 10:37  dubnium  阅读(19)  评论(0)    收藏  举报