1 条题解

  • 0
    @ 2025-10-25 19:10:42

    题意

    NN 个应聘者,每人有一个整数“评价值”。
    我们要处理 MM 次操作,操作分两类:

    1. 查询Tj=1T_j = 1):给定 BjB_j,聘用所有评价值 Bj\ge B_j 的人。被聘用的人按连续编号分组,即:如果 aabb 都被聘用,并且 [a,b][a, b] 之间的所有人也被聘用,则 aabb 在同一组。问此时有多少组。
    2. 修改Tj=2T_j = 2):给定 Cj,DjC_j, D_j,将第 CjC_j 个应聘者的评价值改为 DjD_j

    样例 1 解释

    初始评价值:
    [8,6,3,5,4][8, 6, 3, 5, 4]

    • 第一次查询 B=5B=5:聘用 1,2,41, 2, 4(评价值 5\ge 5)。
      分组:[1,2][1,2] 连续聘用,[4][4] 单独一组,共 22 组。
    • 修改:第 44 个应聘者评价值改为 11
    • 查询 B=5B=5:聘用 1,21, 2,一组,输出 11
    • 查询 B=3B=3:聘用 1,2,3,51, 2, 3, 5,分组:[1,2,3][1,2,3] 一组,[5][5] 一组,共 22 组。

    思路分析

    关键观察

    设我们聘用的员工集合是:所有 AiBA_i \ge B 的人。
    把他们按编号从小到大排序,分组规则是:连续的一段被聘用的员工属于同一组
    所以,组数 = 聘用的员工数 - 相邻聘用员工中编号连续的对数。

    更具体地:
    设聘用的员工编号为 p1,p2,,pkp_1, p_2, \dots, p_k(已排序),那么组数

    $$\text{groups} = k - \#\{i \mid p_{i+1} = p_i + 1\} $$

    即:组数 = 聘用人数 - 相邻聘用且编号连续的对数。


    如何快速计算

    对于给定的 BB,我们要数出:

    1. 有多少个 ii 满足 AiBA_i \ge B(聘用人总数)。
    2. 有多少对相邻的 ii 满足 AiBA_i \ge BAi+1BA_{i+1} \ge B(这些会减少组数,因为 iii+1i+1 在同一组)。

    那么:

    $$\text{答案} = \text{count\_ge}(B) - \text{count\_adj\_ge}(B) $$

    其中 count_ge(B)\text{count\_ge}(B)AiBA_i \ge B 的人数,count_adj_ge(B)\text{count\_adj\_ge}(B) 是满足 AiBA_i \ge BAi+1BA_{i+1} \ge B 的相邻对 (i,i+1)(i, i+1) 的数量。


    数据结构选择

    我们需要支持:

    • 单点更新 AiA_i
    • 查询:给定 BB,快速得到 count_ge(B)\text{count\_ge}(B)count_adj_ge(B)\text{count\_adj\_ge}(B)

    这可以用两个 Fenwick 树(树状数组)线段树 实现,按值域维护。

    具体做法:

    1. 对值域离散化(因为 Ai,Bj,DjA_i, B_j, D_j 范围大,但总数 6×105\le 6\times 10^5)。
    2. 第一个 Fenwick 树 cnt 维护每个值有多少个 AiA_i 等于它(用于求 count_ge(B)\text{count\_ge}(B))。
    3. 第二个 Fenwick 树 adj 维护每个值有多少对相邻的 (i,i+1)(i, i+1) 的最小值 \ge 该值(用于求 count_adj_ge(B)\text{count\_adj\_ge}(B))。

    更新操作

    当修改 AposA_{pos}oldold 变为 newnew 时:

    • 更新 cnt:在 oldold 处 -1,在 newnew 处 +1。
    • 更新相邻关系:影响 (pos1,pos)(pos-1, pos)(pos,pos+1)(pos, pos+1) 这两对。
      • 先删除旧值对这两对的贡献(在 adj 中,在 min(Apos1,old)\min(A_{pos-1}, old) 处 -1,在 min(old,Apos+1)\min(old, A_{pos+1}) 处 -1)。
      • 更新 AposA_{pos}newnew
      • 再添加新值对这两对的贡献(在 min(Apos1,new)\min(A_{pos-1}, new) 处 +1,在 min(new,Apos+1)\min(new, A_{pos+1}) 处 +1)。

    查询操作

    给定 BB

    • count_ge(B)=vBcnt[v]\text{count\_ge}(B) = \sum_{v \ge B} cnt[v]
    • count_adj_ge(B)=vBadj[v]\text{count\_adj\_ge}(B) = \sum_{v \ge B} adj[v]

    用 Fenwick 树可以 O(logN)O(\log N) 求后缀和。


    复杂度

    • 离散化 O((N+M)log(N+M))O((N+M) \log (N+M))
    • 每次操作 O(logN)O(\log N)
    • O((N+M)logN)O((N+M) \log N)

    • 1

    信息

    ID
    4092
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者