hdu 4747

这题思路有点纠结啊啊啊啊啊!!! 类似于今年多校的线段数,多校的时候是固定左端点,此处是固定右端点。。。这类题还是要多想想维护啊。。。。

考虑一组数,那么最小的肯定是0,1,2...递增的数,那么首先预处理出1到n的mex值(表示从1到i的区间mex值为多少),
然后我要找之后与当前值第一个相同的值的位置,用next【i】表示,这里为什么,后面再说

然后考虑从L 到 R 位置,当下固定R位置,枚举L从1到R-1,那么可以考虑1 到 R已经求出来了

那么可以考虑每删除一个值对后面的影响(即枚举数对i,到R中的所有数対(i,i),(i,i+1),(i,i+2),...,(i,n))
如果每次删值都不影响就是mex*对数

好现在说明为什么要next【i】
从i到R如果删除A[i]不影响mex那么这一段的值还是mex(a[i]>mex),如果当前A【i】小于这一段的mex了,
那么必然有一段0到A【i】-1的连续的值与A【i】+1到mex的连续值,那么删除A【i】必然会使得
pos到next【i】-1的位置的mex值为A【i】,这里pos值第一个受A【i】影响的位置
所以这里我每回要找到一个next【i】 然后将i到next【i】-1影响的一段区间赋值就好了。
然后求数对和就是将每次删除一个i后的值累加
这区间赋值和累加的就可以用线段树来做了
这里需要注意的是,预处理mex的值必然是递增的,那么这就是个有序的序列了。


然后还有个小优化,本来10^9大小的数,是需要离散化的,但是可以看到当一个数是完整的连续数的时候 最大值不会超过maxn+1 所以所有超出的部分都是maxn+1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值