NOIP 模拟赛 2023.07.04 题解--zhengjun

link

T1

转化为 \((b_i,a_i)\)\((b_j,a_j)\) 之间的斜率。

发现性质(省略),只需要计算相邻两个点之间的答案即可,用 set 就行了。

T2

先找性质,发现即为 \(a,b,c\) 各有某一位是“独特”(即其他两个数这一位与之不一样)的。

直接 \(O(8^2n)\) 记录各个状态,预处理转移优化一下即可。

T3

首先需要找到询问时,该节点的生成时间。

    _
   / \   _
 _/   \_/ \
/

例如用 / 表示加点,\ 表示上跳,那么只需要找到查询点之前第一个比它小的点,即为生成时间。

在询问序列上建立线段树,枚举操作序列中每个点的深度。

线段树维护区间加,单点查,查区间小于某数的最后一个数。

这种离线方法第一次发现,感觉有很强的扩展性

计算完生成时间就可以再次离线,计算区间中某个点被加点了多少次即可。

T4

一眼题,题目还看错了,好似。

注意【第 \(i\) 次占据距离为 \(i\) 的点】与【每次沿边扩张】的区别,前者若相遇,会继续扩张,后者不会。

直接建 dfs 树,拿出返祖边,然后拿出这些端点建个虚树。

这样一来,每个【不在环上的点】的状态就只由【与之最近的环上的点】的状态决定,直接预处理。

然后枚举最终答案在哪个位置,然后枚举虚树上的 \(O(200)\) 条边,计算答案。

分类讨论共 9 类,左端点 >,<,= 以及右端点,细节很多。预处理虚树上点之间的最短距离(Floyd)

特殊处理【经过当前枚举位置的新边】。

最后,只需要将点的个数树上前缀和即可。

赛时冲 T4 没冲出来,可惜了。

posted @ 2023-07-04 16:18  A_zjzj  阅读(15)  评论(0编辑  收藏  举报