【线段树】HDU 4747 MEX

通道:http://acm.hdu.edu.cn/showproblem.php?pid=4747

题意:mex(L, R)表示区间上第一个没出现的最小非负整数,对于序列a[],求所有的mex(L, R)的和

思路:就是求mex(1,1) + mex(1,2)+....+mex(1,n)

           +mex(2,2) + mex(2,3) + ...mex(2,n)

                 +mex(3,3) + mex(3,4)+...+mex(3,n)

                    ...+ mex(n,n)

可以知道mex(z,i),mex(z,i+1)...mex(z,n)是递增的,首先很容易求得mex(1,1),mex(1,2)......mex(1,n),因为上述n个数是递增的,然后使用线段树维护,需要不断删除前面的数。

  比如删掉第一个数a[1]. 那么在下一个a[1]出现前的 大于a[1]的mex值都要变成a[1]

  因为是单调递增的,所以找到第一个 mex > a[1]的位置,到下一个a[1]出现位置,这个区间的值变成a[1].

代码:https://github.com/Mithril0rd/Rojo/blob/master/hdu4747.cpp

TAG:好题,线段树维护

posted @ 2014-11-05 15:59  mithrilhan  阅读(131)  评论(0编辑  收藏  举报