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;
}

 

转载于:https://www.cnblogs.com/zufezzt/p/5377164.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值