题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747

题意:给出一个数列A。计算所有的mex(i,j)之和。1<=i<=j<=n。

思路:从前向后依次统计以该位置为左端点的区间之和。那么现在我们考虑i计算之后后面的变化。考虑极端情况,若i位置之后的所有数字都大于i,那么i计算之后后面的所有数对的mex值起码为A[i]。那么,我们记录i之后数字A[i]出现的最早位置next[i],每次用A[i]更新[i+1,next[i]-1]这个区间即可。

struct node
{
    int L,R,Max,Min,det;
    i64 sum;
    
    void set(int x)
    {
        det=x;
        Max=Min=x;
        sum=(i64)(R-L+1)*x;
    }
};

node a[N<<2];
int d[N],next[N],p[N],b[N];
int n;

void pushUp(int t)
{
    if(a[t].L==a[t].R) return;
    a[t].sum=a[t*2].sum+a[t*2+1].sum;
    a[t].Min=min(a[t*2].Min,a[t*2+1].Min);
    a[t].Max=max(a[t*2].Max,a[t*2+1].Max);
}

void pushDown(int t)
{
    if(a[t].L==a[t].R) return;
    int M=(a[t].L+a[t].R)>>1;
    if(a[t].det>0)
    {
        a[t*2].set(a[t].det);
        a[t*2+1].set(a[t].det);
        a[t].det=0;
    }
}

void build(int t,int L,int R)
{
    a[t].L=L;
    a[t].R=R;
    a[t].det=0;
    if(L==R)
    {
        a[t].Max=a[t].Min=a[t].sum=b[L];
        return;
    }
    int M=(L+R)>>1;
    build(t*2,L,M);
    build(t*2+1,M+1,R);
    pushUp(t);
}

void update(int t,int L,int R,int x)
{
    if(L<=a[t].L&&a[t].R<=R&&x<a[t].Min)
    {
        a[t].set(x);
        return;
    }
    pushDown(t);
    int M=(a[t].L+a[t].R)>>1;
    if(M>=L&&a[t*2].Max>x) update(t*2,L,R,x);
    if(M<R&&a[t*2+1].Max>x) update(t*2+1,L,R,x);
    pushUp(t);
}

int main()
{
    Rush(n)
    {
        if(n==0) break;
        int i,j=0;
        clr(p,0);
        FOR1(i,n) 
        {
            RD(d[i]);
            if(d[i]>n) d[i]=n+1;
            p[d[i]]=1;
            while(p[j]) j++;
            b[i]=j;
        }
        for(i=0;i<=n+1;i++) p[i]=n+1;
        for(i=n;i>=1;i--)
        {
            next[i]=p[d[i]];
            p[d[i]]=i;
        }
        build(1,1,n);
        i64 ans=a[1].sum;
        FOR1(i,n)
        {
            if(i+1<=next[i]-1) update(1,i+1,next[i]-1,d[i]);
            update(1,i,i,0);
            ans+=a[1].sum;
        }
        printf("%I64d\n",ans);
    }
}

HDU 4747 Mex(线段树)的更多相关文章

  1. hdu 4747 mex 线段树+思维

    http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...

  2. hdu 4747 Mex( 线段树? 不,区间处理就行(dp?))

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  3. HDU 4747 Mex ( 线段树好题 + 思路 )

    参考:http://www.cnblogs.com/oyking/p/3323306.html 相当不错的思路,膜拜之~ 个人理解改日补充. #include <cstdio> #incl ...

  4. hdu 4747【线段树-成段更新】.cpp

    题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数. 求出这个数列中所有mex的值. 思路: 可以看出对于一个数列,mex(r, r ...

  5. hdu 4031 attack 线段树区间更新

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Subm ...

  6. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  7. hdu 3016 dp+线段树

    Man Down Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  8. HDU 4747 Mex 递推/线段树

    题目链接: acm.hdu.edu.cn/showproblem.php?pid=4747 Mex Time Limit: 15000/5000 MS (Java/Others)Memory Limi ...

  9. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  10. HDU 4747 Mex(线段树)(2013 ACM/ICPC Asia Regional Hangzhou Online)

    Problem Description Mex is a function on a set of integers, which is universally used for impartial ...

随机推荐

  1. Json Serialize 忽略特定属性

    Json Serialize 忽略特定属性 Json Serialize SerializeFilter 忽略特定属性 key words:Json Serialize jackson fastjso ...

  2. poj 3264 Balanced Lineup 区间极值RMQ

    题目链接:http://poj.org/problem?id=3264 For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) alw ...

  3. 【POJ】【2601】Simple calculations

    推公式/二分法 好题! 题解:http://blog.csdn.net/zck921031/article/details/7690288 这题明显是一个方程组……可以推公式推出来…… 然而这太繁琐了 ...

  4. 【BZOJ】【TJOI2015】线性代数

    网络流/最小割/最大权闭合图 2333好开心,除了一开始把$500^2$算成25000……导致数组没开够RE了一发,可以算是一次AC~ 咳咳还是回归正题来说题解吧: 一拿到这道题,我就想:这是什么鬼玩 ...

  5. Leetcode#99 Recover Binary Search Tree

    原题地址 中序遍历二叉搜索树,正常情况下所有元素都应该按递增排列,如果有元素被交换,则会出现前面元素大于后面的情况,称作反序.由于交换了两个节点,所以通常会有两处反序,但如果是两个相邻节点发生了交换, ...

  6. 全球SEO行业调查报告

    这是一份来自MOZ的调查报告,本报告是两年一次的SEO行业调查,主要围绕SEO从业人员的特征.工作内容时间分配比例.对未来市场的看法.使用的seo工具以及SEO知识扩充渠道等展开. 这份报告可以对从事 ...

  7. linux下解压命令大全(转载)

    .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ——————————————— .gz 解压 ...

  8. Ckeditor注册事件

    这段时间使用js+cookies进行自动草稿保存,个人觉的,这些全在客户端处理比较的好,所以没有使用AJAX+数据库的自动草稿保存方法. 结果出现Ckeditor无法绑定onkeyup,onselec ...

  9. win8系统输入法设置

    Windows 8系统自带微软拼音简捷输入法,无论是在Windows的开始屏幕新界面中还是Windows传统桌面里,按Shift键或者直接点击屏幕上的"中/英"标识即可切换中英文输 ...

  10. (转)Tips for Optimizing C/C++ Code

    本来要自己翻译的,随手搜索了一下,发现五天前已经有人翻译了,我就不重复发明轮子了. 转自:http://blog.csdn.net/yutianzuijin/article/details/26289 ...