ZOJ 3929 Deque and Balls

答案=所有情况中总共递减次数*2

放完i个和放完i-1个之间的递减次数是可以递推的。

有一部分是放完i-1个之后产生的,还有一部分是放完第i个之后新产生的。

注意减去多加的部分。

2的i次方可以打个表,然后就再开一个sum预处理2的i次方的前缀和,就可以递推了。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const int maxn=100000+10;
long long MOD=1e9+7;
long long w[maxn],ans,q[maxn],sum[maxn];
int n,x;

long long M(long long a,long long b)
{while(a<0) {a=a+b;} a=a%b; return a;}

void init()
{
    q[0]=q[1]=1; for(int i=2;i<=100000;i++) q[i]=M(2*q[i-1],MOD);
    sum[0]=1; for(int i=1;i<=100000;i++) sum[i]=M(sum[i-1]+q[i],MOD);
}

int main()
{
    init(); int T; scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n); memset(w,0,sizeof w); ans=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            if(i!=1) ans=M(ans+sum[i-2]-w[x],MOD);
            w[x]=M(w[x]+q[i-1],MOD),ans=ans*2;
        }
        printf("%lld\n",M(ans,MOD));
    }
    return 0;
}

 

posted @ 2016-04-11 09:40  Fighting_Heart  阅读(456)  评论(0编辑  收藏  举报