zoj3929 Deque and Balls 【找规律】

来源:互联网 发布:公需课挂机软件2017 编辑:程序博客网 时间:2024/05/24 03:22

比赛的时候以为是找逆序数,浪费了两个小时。
1. 首先不考虑相等的情况,当放入第k个时,第1、2、3、4、5。。。个数对他的贡献分别是1、1、2、4、8、16。。。即放入第k个数时,结果增加2的k-2次,
2. 考虑相等时的情况,假设第i个数相等,那么只有i为第一个或者为最后一个才有影响,第i+1到k-1的数字排列方式唯一,即将结果减去2的i-2,维护一个数组记录相同需要减去的值即可

#include<bits/stdc++.h>using namespace std;typedef long long ll;ll ans,c[123456],a[123456],sum[123456];const ll m=1e9+7;int main(){    int _,i,n;    scanf("%d",&_);    while(_--)    {        scanf("%d",&n);        c[0]=1;        for(i=1;i<=n;i++)        {            scanf("%lld",&a[i]);            c[i]=c[i-1]*2%m;        }        ans=0;        memset(sum,0,sizeof(sum));        sum[a[1]]=1;        for(i=2;i<=n;i++)        {            ans=(ans+c[i-2])%m;            ans=(ans-sum[a[i]]+m)%m;            sum[a[i]]=(sum[a[i]]+c[i-2])%m;            ans=ans*2%m;        }        printf("%lld\n",ans);    }    return 0;}
0 0
原创粉丝点击