很好的思维题目,看了思路自己琢磨一下,代码很好写。
ACcode:
#include<cstdio>
#include<cstring>
int const ns=1111111;
int n,q,t,k;
long long dp[ns],s;
int a[ns],pre[ns],len[ns],suf[ns],pos[ns];
int main()
{
while (~scanf("%d",&n)&&n)
{
dp[1]=n,s=k=0;
memset(pre,0,sizeof(pre));
memset(suf,0,sizeof(suf));
memset(len,0,sizeof(len));
memset(pos,0,sizeof(pos));
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
for (int i=1;i<=n;i++)
{
t=a[i];
len[i-pos[t]]++;
pos[t]=i;
}
memset(pos,0,sizeof(pos));
for (int i=n;i>0;i--)
{
s+=len[i];
t=a[i],k++;
if (pos[t]) k--;
else pos[t]=i;
suf[n-i+1]=k;
}
for (int i=2;i<=n;i++)
{
s-=len[i-1];
dp[i]=dp[i-1]-suf[i-1]+s;
}
scanf("%d",&q);
while (q--)
{
scanf("%d",&t);
printf("%I64d\n",dp[t]);
}
}
return 0;
}
198

被折叠的 条评论
为什么被折叠?



