codeforces 1117g Recursive Queries

题面

 

题意:

给出一个n的排列pn,Q个询问(1e6级别),每个询问为Li,Ri。

设Ml,r为l~r之间最大值的位置,那么函数f(l,r)=r-l+1+f(l,mid-1)+f(mid+1,r)

f(l,r) (l>r)=0

 

题解:乍一看除了暴力递归似乎没有什么好办法QAQ,但其实这是一道很套路的题。

第i个位置对答案的贡献就是它在递归中的深度

我们考虑所有询问的Li都为1。我们想办法从1~i-1递推出i的深度

设depi为i的深度

找到i前面第一个比pi大的位置j(如果没有为0),那么不难发现dep[i]=dep[j]+1。可以发现这时j+1~i-1之间所有数的深度也都加了1!   因为如果没有这个i,从j就直接跳到了j+1~i-1的最大值位置,而现在却要在i这边中转一下。

那么我们就可以维护出Li为1的所有询问了

 

 

然后我们从左到右枚举左端点i。考虑每次删除最左边一个数的情况。

我们设j为i右边第一个比pi大的位置。

对于i+1~j-1,因为pi是这段区间中的最大数,现在没有了pi,所以对于这段区间深度要集体-1。

 

然后对于一个Li为i的询问就求个区间和就好了。

 

没有代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值