3 条题解

  • 1
    @ 2023-3-11 19:49:51

    没参加比赛,过来口胡一下。

    先假设可以离线。

    对右端点 rr 进行扫描线,在每个元素最后一次出现处标记上其信息,否则不标记。

    然后就是查询从 ll 到当前末尾被标记的元素的第 kk 小值。

    也就是 2-side 矩形查询 kk 小值。

    我们用权值线段树套位置的线段树,直接在其上二分即可;注意内层树要动态开点。

    由于本题强制在线,不能扫描线,我们直接对树套树可持久化一下即可。

    时间复杂度 O((n+q)log2n)O((n+q)\log^2n),空间复杂度 O(nlog2n)O(n\log^2n);内层使用可持久化平衡树(应该?)就可以做到 O(nlogn)O(n\log n) 空间了。

    这题为啥正解是分块啊,怎么回事。

    • 1
      @ 2023-3-11 18:43:41

      离线可以直接莫队,在线考虑把莫队信息预处理出来不就行了。

      • 0
        @ 2023-3-11 20:11:06

        首先这个题离线直接莫队即可。

        然后还有另一种做法。

        就是二分答案 xx,然后数有多少种颜色没有在区间内出现过,即统计 (i,nxt[i])(i, nxt[i])[1,l1][r+1,n][1, l - 1][r + 1, n] 内的个数,整体二分即可。

        在线怎么搞。

        莫队寄了。

        然后那个二分答案的话要在线三维偏序,空间应该是2log的(如果有1log做法请指正。

        出题人写的是值域分块。

        s[i][j][k]s[i][j][k] 表示第 ii 块到第 jj 块内值域第 kk 块出现的颜色数,记 app[i][j]app[i][j] 表示前 ii 块内 jj 出现的次数。

        我们要知道什么?我们要知道值域第 kk 块在 [l,r][l, r] 区间内出现了几个,以及 xx 这个颜色有没有在 [l,r][l, r] 内出现。

        后者是容易的,而前者呢。

        我们用零散块内的元素去更新整块区间的 ss

        具体地,设整块区间为第 ll 块到第 rr 块,开一个 cntcnt 数组,若当前元素 xxcnt[x]=0cnt[x] = 0 且在 [l,r][l, r] 这几个整块内没有出现过,那就更新 s[l][r][belong[x]]s[l][r][belong[x]],然后给 cnt[x]cnt[x] 加一。

        查询时找到第 kk 小所在的块然后枚举即可。

        • 1

        信息

        ID
        277
        时间
        3000ms
        内存
        512MiB
        难度
        8
        标签
        (无)
        递交数
        29
        已通过
        6
        上传者