您的位置:首页 > 产品设计 > UI/UE

zoj3929 Deque and Balls 【找规律】

2016-04-13 12:02 363 查看
比赛的时候以为是找逆序数,浪费了两个小时。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: