这代码写的很搓,但是。。赛后证明思路是正确的,就是maxn一直设到500000,结果一直wa。赛后发现只要到600000就可以ac。
经验不足啊。
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1000000
#define mod 1000000007
#define LL __int64
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid ((t[rt].l+t[rt].r)>>1)
LL a[maxn];
struct tree
{
LL l,r;
LL mul;
}t[maxn<<2];
bool cmp(LL a,LL b)
{
return a>b;
}
void pushup(LL rt)
{
t[rt].mul=(t[ls].mul*t[rs].mul)%mod;
}
void build(LL rt,LL l,LL r)
{
t[rt].l=l,t[rt].r=r;
if(l==r)
{
t[rt].mul=a[l];
return ;
}
build(ls,l,mid);
build(rs,mid+1,r);
pushup(rt);
}
LL query(LL rt,LL l,LL r)
{
if(t[rt].l==l&&t[rt].r==r)
return t[rt].mul;
if(r<=mid)
return query(ls,l,r)%mod;
else if(l>mid)
return query(rs,l,r)%mod;
else
return (query(ls,l,mid)*query(rs,mid+1,r))%mod;
}
int main()
{
LL t;
LL n;
cin>>t;
while(t--)
{
scanf("%I64d",&n);
if(n<=0)
{
printf("0\n");
continue;
}
LL k=1;
for(LL i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
k=(k*a[i])%mod;
}
sort(a+1,a+1+n,cmp);
LL ans=k;
build(1,1,n);
LL temp;
for(LL i=1;i<=n-1;i++)
{
if((i+1)/2-1>=1&&(i+1)/2+1<=n)
temp=(query(1,1,(i+1)/2-1)*query(1,(i+1)/2+1,n))%mod;
else
{
if(((i+1)/2)==1)
temp=query(1,(i+1)/2+1,n);
else if(((i+1)/2)==n)
temp=query(1,1,(i+1)/2-1);
else
{
temp=(query(1,1,(i+1)/2-1)*query(1,(i+1)/2+1,n))%mod;
}
}
ans=(ans+(a[(i+1)/2]-1)*temp)%mod;
}
printf("%I64d\n",ans);
}
return 0;
}