比赛的时候以为是找逆序数,浪费了两个小时。
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;
}