2021.01.15【NOIP提高B组】模拟 总结

2021.01.15【NOIP提高B组】模拟 总结

第一题 开车旅行

考场上打了70分。
预处理出每个点下一步,然后暴力跳。
正解设 f i , j f_{i,j} fi,j表示点 i i i j j j步(一步为小A和小B总和)的位置, g i , j , 0 / 1 g_{i,j,0/1} gi,j,0/1表示途中小A/小B的价值总和。
然后倍增跳一下即可,关键如何预处理 j = 0 j=0 j=0的情况。
从大到小排序高度,然后按原来顺序跑,每次做完之后把这个点从链表中删除,因为可以发现,最大值和次大值一定会在这个点前两个点到这个点后两个点之间,链表维护。
时间复杂度为 O ( n   l o g 2 n ) O\left(n\ {log}_2^n\right) O(n log2n)

第二题 同余方程

将原题转化为 a x − b y = 1 ax-by=1 axby=1,其中 a , b a,b a,b已知,很显然这是一道扩展欧几里得算法例题。
推倒过程( ( a , b ) \left(a,b\right) (a,b)表示 a , b a,b a,b的最大公约数):
2021.01.15【NOIP提高B组】模拟 总结_第1张图片
如果求出来的 x x x小于 0 0 0,则加上一个 b b b
愉快的过了。

第三题 借教室

考虑线段树维护最小值,然后卡一下常,就过了。
其实也可以用二分+差分来做,更快一点

第四题 疫情控制

二分一下答案。
考虑贪心往上跳。
就跳到第二层,然后把还可以继续跳的距离按小到大排序。
接着把没覆盖的点与这些点匹配一下。
时间复杂度 ( m + n ) l o g 2 n \left(m+n\right){log}_2^n (m+n)log2n

你可能感兴趣的:(比赛总结)