hdu4655 yy+推导 多校第六场

1,n-1,2,n-2……这样是最优的

难的是给出一个排列怎么求答案

暴力不行,要递推了

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
#define N 1000500
#define mod 1000000007
#define ll long long
int a[N],b[N],n;

int main ()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
            scanf("%d",&a[i]);
        sort(a+1,a+1+n);
        int cnt=0;
        for(int i=1,j=n;i<=j;++i,--j)
        {
            b[++cnt]=a[i];
            b[++cnt]=a[j];
        }
        for(int i=1;i<=n;++i)
            a[i]=b[i];
        ll A=a[1],num=a[1];
        ll num1=1;
        for(int i=2;i<=n;++i)
        {
            if(a[i]>=a[i-1])
                A=a[i]*(A+num)%mod-num;
            else
                A=a[i]*(A+num)%mod-(num-((a[i-1]-a[i])*num1%mod));
            A=(A%mod+mod)%mod;
            num1=num;
            num=num*a[i]%mod;
        }
        cout<<A<<endl;
    }
    return 0;
}




你可能感兴趣的:(hdu4655 yy+推导 多校第六场)