2026/4/18NOIP模拟赛

https://cplusoj.com/d/senior/contest/69e1eaa61363e1a076acb1a6

T1 跑步 run

每行做一次,单调栈。

T2 网络 net

生成树中点一定是图的中点,可能是边也可能是点。
先求出每个点到所有点的最短路 \(d_{u,v}\),候选边满足:连接两个候选点且不存在某个点到这两个候选点的距离都是最长的。
复杂度 \(O(\frac{n^3}{\omega})\)。

bitset 到底能跑多少啊这算出来都 \(4.8\times 10^8\) 了。

T3 游走 walk

考虑把反弹变成穿过,这样 \(rank\) 为 \(i\) 的人等价于原本第 \(i\) 个人,碰到边缘就反弹,那么走 \(2L\) 个时刻一定会回到原始状态。这样可以分成若干个 \(2L\) 和 \(T\bmod 2L\)。处理出每个人往左右分别碰撞了几次就可以求出答案。

若 \(x_1,x_2\) 两个人会在 \([l,r]\) 相遇,需要满足:

  • \(x_1\) 向右走,\(x_2\) 向左走。
  • \(2l\le x_1+x_2\le 2r\)。
  • \(0\le x_2-x_1\le 2T\)。

那么考虑 \(x_1\) 的排名,每相遇一次就会增加 1,则这是一个区间加,差分处理,区间用双指针搞一下。
反弹可以用外面走进来的人代替,这是等价的。注意算排名时负半轴走进来的人是排名为 0 的。
复杂度大概是 \(O(qn+n\log n)\),因为要排序。

T4 移除 move

ori:P4125 [WC2012] 记忆中的水杉树
注意点交不会阻碍。

先考虑第二问,显然只往一个方向移动就可以移除所有的线段,这里不妨设向上移动。
考虑线段之间移除的顺序,如果 \(u\) 挡住 \(v\) 就连边,这样我们找到一个拓扑序即可。考虑扫描线,加入一个线段的时候连接前驱后继即可,线段不交所以相对顺序不会改变,使用平衡树一类的东西维护。

第一问,四个方向都求一下什么时候不合法。发现上面这个 DAG 并不具有传递性,但是如果要求横坐标相交就是对的。那么条件变成,如果有 \(i<j\),满足:

  • \(p_j\) 拓扑序比 \(p_i\) 小。
  • \(p_j\) 和 \(p_i\) 横坐标交集不为空。

那么这样就会有非法的移动。用线段树维护区间内最小拓扑序即可,复杂度 \(O(n\log n)\)。

posted @ 2026-04-18 13:32  TallBanana  阅读(26)  评论(0)    收藏  举报