Gravatar
yrtiop
积分:2053
提交:304 / 803

std 似乎是直接插排,但我并不会这种做法,讲一下我的想法。

首先,想一想就可以发现,$a_i$ 插排后的位置即为原序列中 $\lt a_i$ 的数的数量加上前 $i$ 个数中等于 $a_i$ 的数量。

发现这题的修改数量和 $n$ 的范围都非常小,不难想到标算是 $\mathcal{O}(n^2)$ 级的。

那么可以设计出以下算法:

首先设 $cnt_x$ 为 $a_x$ 插排后在原序列中的位置。

根据上述算法 $\mathcal{O}(n^2)$ 算出 $cnt$ 数组,然后进入询问。

对于修改操作,直接暴力地除去原 $a_x$ 的贡献,计算 $v$ 的贡献,并把 $cnt_x$ 再求出来。

对于询问操作,直接输出 $cnt$ 即可。

时间复杂度 $\mathcal{O}(n^2 + 5 \times 10^3 \times n)$,常数有点大,洛谷和 CCF 的评测机应该是能卡过去,但 COGS 需要一点常数优化,而且要手动吸氧(开O2)


题目3616  [CSP 2021J]插入排序 AAAAAAAAAAAAAAAAAAAAAAAAA      12      评论
2022-10-08 21:39:46