2025.12.16 NOI 模拟赛 题解

比赛

订正

T1 P130192 [省选二十连测第五套 ] --T1--谎言(uso)

题意

给定 \(x_{1\sim n},y_{1\sim n}\),求出 \((i,j)\) 数量满足 \(x_i<x_j,y_i<y_j\) 且不存在 \(k\) 使得 \(x_i<x_k<x_j,y_i<y_k<y_j\)\(n\le 2\times10^5\)

分析

离散化后扫描线,转化为单点修改和查询一个后缀中非严格前缀最大值的数量,容易用单侧递归线段树做到 \(O(n\log^2 n)\)

代码

可以用分治做到相同的复杂度

T2 P130191 [省选二十连测第五套 ] --T2--风(kaze)

题意

给定一个排列,若干次区间 rotate,每次操作后,判断是否存在长度为 \(3\) 的递增子序列,\(n,q\le120000\)

分析

\(\text{fhq-treap}\) 维护序列,区间旋转是容易的

每个结点维护:区间内最小最大值 \(mn,mx\),区间内满足 \(p_i<p_j\) 的位置中 \(p_j\) 的最小值和 \(p_i\) 的最大值

\(\text{push\_up}\) 时,需要在右儿子查询 \(\min(val(u),mn(left))\) 的后继

要在子树 \(u\) 内查询 \(x\) 的后继,若 \(val(u)>x\),若存在左侧子树内的 \(T\) 使得 \(x<val(T)<val(u)\),即当前状态存在长度为 \(3\) 的递增子序列,这种情况已经计入答案了,无需再次查找,因此只需要向右子树查询(需要将 \(u\) 计入贡献),若 \(val(u)\ge x\) 则同理只需要向左子树查询

在左儿子中查询同理

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

代码

T3 P130193 [省选二十连测第五套 ] --T3--梦(yume)

题意

一个字符串,首/尾/正中间 插入删除字符,或查询给定串在其中的出现次数,操作数 \(n\le2\times10^5\),查询串总长 \(m\le2\times10^6\)

分析

先考虑只有末尾插入删除的情况

对操作建树,则相当于查询一个字符串在一条到根的链上的出现次数

对查询串建立 \(\text{ACAM}\),对操作树 \(\text{dfs}\) 的同时在 \(\text{ACAM}\) 上维护每个串的出现次数,等价于 \(\text{fail}\) 树上的链加单点查询,容易用树状数组实现

对于一般情况,前后两半视为 \(\text{deque}\) 用双栈维护,一共拆分为四段,跨段的使用哈希,精细实现可以做到 \(O(m)\),段内部分只有一端插入删除,可以用前述算法

总时间复杂度 \(O(m|\sum|+(n+m)\log m)\)

代码

比赛结果

\(100+40+40\)\(\text{rk}5\)

posted @ 2025-12-19 11:45  Hstry  阅读(15)  评论(0)    收藏  举报