2025.3.31 NOI 模拟赛 题解

比赛

T1 NFLS #18078. 避难所

题意

给定 \(n\times n\) 平面上的 \(n\) 个点(\(1\le n\le10^4\)),求一条从 \((1,1)\) 开始、\((n,n)\) 结束、穿过所有 \(n\) 个点的路径,满足路径长度 \(\le1.5\times10^6\)

分析

使用莫队加奇偶排序优化可以到 \(2n\sqrt n\pm O(n)\)

要卡到这一上限,发现数据需要聚集在块的两侧,使路径来回移动

此时可以令最上最下 \(\frac{\sqrt n}2\) 行单独作为一块计算一次

取两种方式中较短的一种,可证路径长度为 \(n\sqrt {2n}\pm O(n)\)

另一种方式为在 \(\sqrt n\) 附近枚举块长,取最短的,可过

代码

参考

T2 NFLS #P27365. 天津四 CF1608G Alphabetic Tree

T3 NFLS #P25327. 联邦之终 \(\quad\) CF1208H Red Blue Tree 加强版

题意

给定一棵 \(n\) 个点的有根树和 \(k\),叶子结点有权值 \(0/1\),非叶子结点权值为 \(1\) 当且仅当其儿子中 \(1\) 的数量减去 \(0\) 的数量 \(\ge k\)\(q\) 次操作查询某一点权值,改变一个叶子的权值,或修改 \(k\)\(n,q\le5\times10^5\)\(128\text M\)

分析

\(k\) 增加,显然只会使部分权值为 \(1\) 的点权值变为 \(0\)

对于每个点 \(u\),令 \(k_u\) 表示当 \(k<k_u\) 时结点 \(u\) 权值为 \(1\),当 \(k\ge k_u\) 时结点 \(u\) 权值为 \(0\)

对于叶子结点 \(u\),若权值为 \(1\)\(k_u=\infty\),若权值为 \(0\)\(k_u=-\infty\)

对于非叶子结点 \(u\)\(k_u=\min\{x\mid \sum_{v\in son(u)}([x<k_v]-[x\ge k_v])<x\}=\min\{x\mid \sum_{v\in son(u)}(1-2[k_v\le x])<x\}\)

考虑对原树树剖

每个结点 \(u\) 用平衡树维护轻儿子的 \(k\) 值的集合 \(S_u\)

线段树每个叶子维护 \((k_1,k_2)\),表示重儿子权值为 \(0/1\) 时的 \(k_u\),容易由轻儿子的 \(k\) 值的集合求出

线段树非叶子结点维护信息的复合,\((a,b)\circ (c,d)=(\min(b,\max(a,c)),\min(b,\max(a,d)))\)(其中 \((c,d)\)\((a,b)\) 的重儿子)

修改叶子权值时,从下往上跳链,每次跟新链的一个位置的 \((k_1,k_2)\),然后算出链顶的 \(k_u\) 并跟新链顶的父亲的集合

跟新 \((k_1,k_2)\) 时,发现单点修改只会令 \(k_1\)\(k_2\) 改变 \(O(1)\),因此暴力 \(\pm1\) 即可

时间复杂度 \(O(n\log n+q\log^2 n)\)

代码

参考

比赛结果

\(100+19+0\)\(\text{rk} 29\)

posted @ 2025-03-31 21:13  Hstry  阅读(18)  评论(0)    收藏  举报