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

先不考虑算重的情况,则总方案数为 x=1cntCjxix+1len

考虑两段极长合法子串 (l1,r1),(l2,r2)(l1l2r1r2) ,则当变换区间包含 (l1,l2)(r1,r2) 时,两者方案一定不同(一个变了一个没变)
故答案减去 Cr1l2+1len 即可

复杂度 O(n2) 考虑优化

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

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

T3

dijkstra + 最短路径图好题

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

考虑 UV 的最短路和 ST 的最短路的交集一定是连续的(边权皆为正),那么可以 O(n2) 枚举路径 PQ 并计算 min disSP+disQV 

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

T4

点分治好题

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

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

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

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

posted @   dubnium  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示