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\) 的节点的答案即可

浙公网安备 33010602011771号