JOISC 2021 大部分题解
Last Update:
感觉比
这里有除了 【IOI 热病】 的所有传统题的题解。
Day1T3 饮食区
这道题再次说明 JOISC 的题目排序是乱序的。
题意: https://loj.ac/p/3489
容易发现,如果我们能求出这个队列目前一共 pop 掉了多少人,那么我们进行整体二分/可持久化线段树+二分就可以求得答案。
而求出 pop 掉多少人等价于求出这个队列现在有多少人。
观察队列人数的变化,注意到操作
当时脑子烧了,想了一个
时间复杂度
代码: https://loj.ac/s/1777073
Day2T2 道路建设
题意 : https://loj.ac/p/3491
做完这题才意识到我两年前好像见过这题。
欲求前
求第
此时曼哈顿距离就不大好做了,考虑将坐标系旋转
那么
那么把点按
在找有多少对点的距离
时间复杂度
代码:https://loj.ac/s/1777222
Day3T2 保镖
题意:https://loj.ac/p/3494
神仙题,主要是第一步难以想到。
考虑保镖和人相遇需要时间和位置都重合,在一维的数轴上不好做,不妨以坐标和时间为两维建立坐标系,将问题变为二维。
此时每个人相当于一条斜率为
图还是不大美观,考虑将坐标系旋转
注意到在两次变换之后,新图中两点之间的距离被拉长至原图的
此时所有人的轨迹可以交织成一张网格图。如果保镖从一开始就在网格图的格点上,那么答案其实是容易算的。设
问题在于保镖一开始可能落在某个小网格的中间。
考虑此时保镖的决策,一定是先向上走一段,走到某条格线,然后向右拐走到一个格点。也可能先向右再向上,这是对称的。
此时,保镖走的第一段路是没有贡献的。设其走的第二段路权值为
对于一个
显然,使用李超线段树即可做到
其实还可以做得更好。
注意到
实现的时候可能要把图像按
时间复杂度
代码:https://loj.ac/s/1778383
Day3T3 聚会 2
题意:https://loj.ac/p/3495
比较单薄的题,看出来就做完了。
考虑两个相邻的点
那一定是
考虑选出一条链
这个问题使用点分治+树状数组即可做到
代码:https://loj.ac/s/1777442
Day4T1 聚会 2
题意: https://loj.ac/p/3496
还是差了一步,说明大脑没有完全恢复。
看到字典序最小考虑贪心,显然我们的策略是从
设
那么假设我们选了个区间
我们发现只要快速算出
考虑
我们发现,对于一个
因此我们完全可以通过倍增来计算 DP 值,在
时间复杂度
代码:https://loj.ac/s/1777788
Day4T3 最差记者 4
题意: https://loj.ac/p/3498
首先连边
考虑树的部分怎么做,一个暴力的想法是设出 DP 状态
说到这里,用什么数据结构也就基本呼之欲出:线段树!
我们使用线段树合并维护每个点上的 DP 值。
你会发现我们需要在线段树合并时处理后缀
这也好办,在合并时记录两个变量分别表示这两棵线段树在
在有一个当前节点为空时,需要将维护的后缀
牵扯到标记就会有一个问题:如果标记下传到一段没有节点的区间,我们要怎么处理?
其实在这道题中是不需要处理的。因为实际上 ,DP 的第二维取到的只能是子树内的点权。而子树内的点权对应的位置在单点修改的时候就已经为其新建了一些节点,所以这种情况实际上不会存在。
这也解释了为什么之前要将 DP 状态进行一个小变化。变化之前我们并不能保证子树内的点权对应的位置均被新建了节点。
做完树的部分之后,环的部分只需要枚举环上点的取值即可求得答案。
时间复杂度
代码 : https://loj.ac/s/1777827