绝世好题啊
根据题意可知,sum[1,i](表示从1到i这个区间的mex值)是随着i递增的。
可以根据新加入的数来判断新加的数是多少。
#include
#include
#include
#include
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;
}