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

你可能感兴趣的:(hdu 4747)