1 条题解

  • 1
    @ 2023-6-9 16:33:24

    不会正解,所以写了个根号做法。

    先考虑 q=1q=1 怎么做。

    我们考虑贪心,从小到大扫描线,遇上左边界就插入有边界的小根堆,遇上需求就弹出对应个数的堆顶元素,遇上右边界就弹出堆顶元素(如果存在的话)。

    当某个需求无法解决时直接无解,否则必然有解。

    考虑 q>1q>1 的情况。

    我们考虑求出覆盖一段区间的需求的人的数目是多少。这样每次本质不同的人只有 O(min(m2,n))O(\min(m^2,n)) 种。

    直接主席树是 O(mnlogn)O(m\sqrt n\log n) 的,不优。

    考虑根号平衡,我们把人按左端点排序,每 n\sqrt n 个分一块,每个块内的人再按右端点逆序排序。记录每个位置对应多少个前 kk 个块内的人,查询时再额外统计散块的贡献。

    这样我们就知道每段需求区间被多少个人完全覆盖,进一步通过容斥得到恰好覆盖。

    这样就把人划分成了 O(min(m2,n))O(\min(m^2,n)) 种。

    然后暴力模拟前面的贪心,容易做到 O(mn)O(m\sqrt n)

    总复杂度 O((n+m)n)O((n+m)\sqrt n),空间 O(nn)O(n\sqrt n)

    平衡复杂度时块长取 30003000 实际跑得很快。

    参考代码

    • 1

    信息

    ID
    4369
    时间
    2000ms
    内存
    1024MiB
    难度
    9
    标签
    (无)
    递交数
    15
    已通过
    4
    上传者