hdu-4747-Mex

绝世好题啊

根据题意可知,sum[1,i](表示从1到i这个区间的mex值)是随着i递增的。

可以根据新加入的数来判断新加的数是多少。

 

#include<stdio.h>

#include<string.h>

#include<iostream>

#include<algorithm>

using namespace std;

#define maxn 200010

int a[maxn];

int pre[maxn];

int ss[maxn];

int main()

{

    int n,i,j,ls;

    while(scanf("%d",&n)&&n)

    {

        for(i=1;i<=n;i++)

        {

            scanf("%d",&a[i]);

        }

        memset(pre,0,sizeof(pre));

        memset(ss,0,sizeof(ss));

        __int64 ans,add;

        ans=add=0;

        for(i=1;i<=n;i++)

        {

            if(a[i]<=n)

            {

                ls=pre[a[i]];

                pre[a[i]]=i;

                for(j=a[i];j<=n;j++)

                {

                    if(j==0)ss[j]=pre[j];

                    else ss[j]=min(ss[j-1],pre[j]);

                    if(ss[j]>ls)

                    {

                        add+=ss[j]-ls;

                    }

                    else break;

                }

            }

            ans+=add;

        }

        printf("%I64d\n",ans);

    }

    return 0;

}


 

 

你可能感兴趣的:(HDU)