绝世好题啊
根据题意可知,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 ",ans); } return 0; }