非常好的线段树题。。。。此题必定会火。。。。。

Mex

Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 955    Accepted Submission(s): 320

Problem Description
Mex is a function on a set of integers, which is universally used for impartial game theorem. For a non-negative integer set S, mex(S) is defined as the least non-negative integer which is not appeared in S. Now our problem is about mex function on a sequence.

Consider a sequence of non-negative integers {ai}, we define mex(L,R) as the least non-negative integer which is not appeared in the continuous subsequence from aL to aR, inclusive. Now we want to calculate the sum of mex(L,R) for all 1 <= L <= R <= n.

 

Input
The input contains at most 20 test cases.
For each test case, the first line contains one integer n, denoting the length of sequence.
The next line contains n non-integers separated by space, denoting the sequence.
(1 <= n <= 200000, 0 <= ai <= 10^9)
The input ends with n = 0.
 

Output
For each test case, output one line containing a integer denoting the answer.
 

Sample Input
3
0 1 3
5
1 0 2 0 10
 

Sample Output
5
24
Hint

For the first test case:mex(1,1)=1, mex(1,2)=2, mex(1,3)=2, mex(2,2)=0, mex(2,3)=0,mex(3,3)=0. 1 + 2 + 2 + 0 +0 +0 = 5.

 

Source
 

Recommend
liuyiding
 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

using namespace std;

const int maxn=200005;

typedef long long int LL;

int a[maxn],mex[maxn],next[maxn],mx[maxn<<2],sig[maxn<<2],cnt;
LL sum[maxn<<2];
bool vis[maxn];

void pushUP(int rt)
{
    mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}

void pushDOWN(int rt,int len)
{
    if(~sig[rt])
    {
        sig[rt<<1]=sig[rt<<1|1]=sig[rt];
        mx[rt<<1]=mx[rt<<1|1]=sig[rt];
        sum[rt<<1]=sig[rt]*(len-len>>1);
        sum[rt<<1|1]=sig[rt]*(len>>1);
        sig[rt]=-1;
    }
}

void build(int l,int r,int rt)
{
    if(l==r)
    {
        mx[rt]=mex[cnt];
        sum[rt]=mex[cnt++];
        return ;
    }
    int m=(r+l)>>1;
    build(lson);
    build(rson);
    pushUP(rt);
}

LL query(int L,int R,int l,int r,int rt)
{
    if(L<=l&&r<=R)
    {
        return sum[rt];
    }
    pushDOWN(rt,r-l+1);
    int m=(l+r)>>1;
    LL ret=0;
    if(L<=m) ret+=query(L,R,lson);
    if(R>m) ret+=query(L,R,rson);
    return ret;
}

int getID(int L,int R,int v,int l,int r,int rt)
{
    if(l==r)
        return l;
    pushDOWN(rt,r-l+1);
    int m=(r+l)>>1;
    if(L<=m&&mx[rt<<1]>v) return getID(L,R,v,lson);
    else if(R>m&&mx[rt<<1|1]>v) return getID(L,R,v,rson);
    return R+1;
}

void update(int L,int R,int c,int l,int r,int rt)
{
    if(L<=l&&r<=R)
    {
        sig[rt]=c;
        mx[rt]=c;
        sum[rt]=c*(r-l+1);
        return ;
    }
    pushDOWN(rt,r-l+1);
    int m=(r+l)>>1;
    if(L<=m) update(L,R,c,lson);
    if(R>m) update(L,R,c,rson);
    pushUP(rt);
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF&&n)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",a+i);
        memset(vis,false,sizeof(vis));
        mex[1]=0;
        if(a[1]<n) vis[a[1]]=true;
        while(vis[mex[1]]) mex[1]++;
        for(int i=2;i<=n;i++)
        {
            if(a<n) vis[a]=true;
            mex=mex[i-1];
            while(vis[mex]) mex++;
        }
        map<int,int> mII;
        for(int i=n;i>=1;i--)
        {
            if(mII.find(a)==mII.end()) next=n+1;
            else next=mII[a];
            mII[a]=i;
        }
        cnt=1;LL ans=0;
        memset(mx,0,sizeof(mx));
        memset(sum,0,sizeof(sum));
        memset(sig,-1,sizeof(sig));
        build(1,n,1);
        for(int i=1;i<=n;i++)
        {
            ans+=query(i,n,1,n,1);
            int st=getID(i+1,next-1,a,1,n,1);
            int ed=next-1;
            if(st<=ed) update(st,ed,a,1,n,1);
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

* This source code was highlighted by YcdoiT. ( style: Codeblocks )

HDOJ 4747 Mex的更多相关文章

  1. HDU 4747 Mex 递推/线段树

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

  2. 【HDU 4747 Mex】线段数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意:有一组序列a[i](1<=i<=N), 让你求所有的mex(l,r), mex ...

  3. [HDU 4747] Mex (线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747 这道题是我去年刚入校队的时候参加网赛的题目. 一年过去了,我依然还是不会做.. 这是我难题计划的 ...

  4. HDU 4747 Mex(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意:给出一个数列A.计算所有的mex(i,j)之和.1<=i<=j<=n. ...

  5. hdu 4747 Mex (2013 ACM/ICPC Asia Regional Hangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747 思路: 比赛打得太菜了,不想写....线段树莽一下 实现代码: #include<iost ...

  6. hdu 4747 mex 线段树+思维

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

  7. hdu 4747 Mex

    http://acm.hdu.edu.cn/showproblem.php?pid=4747 设我们输入的数组为 a[],我们需要从 1 到 n 遍历, 假设遍历到 i 时, 遍历的过程中用b[j]表 ...

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

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

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

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

随机推荐

  1. 基本概率分布Basic Concept of Probability Distributions 7: Uniform Distribution

    PDF version PDF & CDF The probability density function of the uniform distribution is $$f(x; \al ...

  2. (转载)最长递增子序列 O(NlogN)算法

    原博文:传送门 最长递增子序列(Longest Increasing Subsequence) 下面我们简记为 LIS. 定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则 ...

  3. MySQL安装问题

    win8.1安装mysql5.6时遇到问题,主要出现最后一步配置卡在了start server这一步会弹窗配置时间过长. 在网上查找方式并尝试之后都不能解决问题,尝试了卸载软件,清理注册表中的mysq ...

  4. BZOJ3224 普通平衡树

    传送门: Treap 版本: //OJ 1999 //by Cydiater //2016.8.30 #include <iostream> #include <cstdio> ...

  5. Manacher算法

    Manacher算法是求回文串最高效的算法,能在线性时间内求出以每一个字符为中心的最长回文串.   首先,我们都能想出$O(N^2)$求出每一个字符为中心的最长回文串的算法.那么我们考虑这样一种情况. ...

  6. ecshop 远程图片本地化

    define('IN_ECS', true); require(dirname(__FILE__) . '/includes/init.php'); $smarty->assign('siteD ...

  7. 修改nginx的访问目录以及遇到的403错误修改总结

    对于这个问题困扰了我好几天,前篇文章介绍了图片服务器的使用,但是两个服务器如何进行通话访问呢,即如何通过nginx来访问ftp服务器上的资源文件呢,这里面需要修改nginx的配置文件(vi /usr/ ...

  8. Markdown常用用法

    很早之前就听过Markdown,一直没用,用过才发现,原来这么好用,迷人,就好比一位知性.大方.成熟.美丽的少妇一样深深吸引着我,特深夜把学习的笔记记录下. 引用 ">"最好 ...

  9. Asp.NET的Trace追踪

    http://m.blog.csdn.net/article/details?id=7026402 当我们扑捉程序错误时,调试器是开发者们最得力的助手.然而,ASP.NET的跟踪,在调试时是一个很棒的 ...

  10. struts2 拦截器和actioninvocation、PreResultListener

       Interceptor说明 Interceptor的接口定义没有什么特别的地方,除了init和destory方法以外,intercept方法是实现整个拦截器机制的核心方法.而它所依赖的参数Act ...