CF1523G 题解

Description

传送门

Solution

Lemma

c n t i cnt_i cnti 表示,当 x = i x=i x=i 时能够租借到房子的人的个数。

那么必定有
∑ i = 1 n c n t i = O ( n ln ⁡ n ) \sum_{i=1}^n cnt_i=O(n \ln n) i=1ncnti=O(nlnn)

Prove

不难发现,当 x = i x=i x=i 时,满足 r i − l i + 1 ≥ x r_i-l_i+1 \ge x rili+1x i i i 个数只有 O ( n x ) O(\frac n x) O(xn) 个。

若这些人都能租借到房子,那么,总共租借到房子的人的个数是
∑ i = 1 n ⌊ n i ⌋ = O ( n ln ⁡ n ) \sum_{i=1}^n \left \lfloor \frac n i \right \rfloor=O(n \ln n) i=1nin=O(nlnn)

证毕。


我们从大到小 x x x,并考虑在值域上进行分治。

令当前分治的区间为 [ l , r ] [l,r] [l,r]。我们先找到被完全包含在 [ l , r ] [l,r] [l,r] 中的下标最小的区间 [ l i , r i ] [l_i,r_i] [li,ri]。显然, i i i 一定能租借到公寓,于是将 a n s x ans_x ansx 加上 r i − l i + 1 r_i-l_i+1 rili+1。接着,我们向 [ l , l i − 1 ] [l,l_i-1] [l,li1] [ r i + 1 , r ] [r_i+1,r] [ri+1,r] 分别进行分治,递归地处理贡献。

现在关键在于,对于当前的 [ l , r ] [l,r] [l,r] 快速找到对应的 [ l i , r i ] [l_i,r_i] [li,ri]。我们可以在脑海里构造一个二维矩阵,其第 x x x 行第 y y y 列上的数为目前所有满足 [ l i , r i ] = [ x , y ] [l_i,r_i]=[x,y] [li,ri]=[x,y] 的最小 i i i。这样,每次 x x x 减小 1 1 1,矩阵就被执行了多次单点修改;同时,每次查询的都是子矩阵最小值。从而,这是一个形如单点修改,查询子矩阵最小值的问题,且强制在线,可以使用树套树(动态开点线段树套动态开点线段树)解决。

这样的复杂度是否是正确的呢?不难发现,对于某个 x x x,其对复杂度的贡献为租借到公寓的人的个数 O ( log ⁡ 2 n ) O(\log^2 n) O(log2n);而根据引理,这些值的和只有 O ( n ln ⁡ n ) O(n \ln n) O(nlnn)。另外,修改总共只有 m m m 个,而每次都是 O ( log ⁡ 2 n ) O(\log^2 n) O(log2n) 的。

总复杂度 O ( n log ⁡ 2 n ln ⁡ n + m log ⁡ 2 n ) ≈ O ( n log ⁡ 3 n + m log ⁡ 2 n ) O(n \log^2 n \ln n+m \log^2 n)≈O(n \log^3 n+m \log^2 n) O(nlog2nlnn+mlog2n)O(nlog3n+mlog2n),本题被解决。

Summary

不要纠结于给定的区间之间的顺序,要敢于在值域上下功夫。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值