UVALive 5990 Array Diversity

来源:互联网 发布:潘石屹三段婚姻知乎 编辑:程序博客网 时间:2024/06/06 14:01

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26408

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>using namespace std;typedef unsigned long long ll;const int N=100010;const int mod=1000000007;ll p[N];int a[N];int n;void init() {    p[0]=1;    for(int i=1; i<N; i++)p[i]=p[i-1]*2%mod;}int main() {    int t;    init();    cin>>t;    while(t--) {        scanf("%d",&n);        int mi=1001000,ma=-1;        for(int i=1; i<=n; i++) {            scanf("%d",&a[i]);            mi=min(mi,a[i]);            ma=max(ma,a[i]);        }        if(mi==ma) {            printf("%lld %lld\n",(ll)n*(n+1)/2%mod,(ll)(p[n]-1+mod)%mod);            continue;        }        int l=-1,r=-1,k=0;        bool fa=0,fi=0;        ll ans=0;        for(int i=1; i<=n; i++) { ///连续的            if(a[i]==mi||a[i]==ma) {                if(l==-1)l=i;                else if(a[l]==a[i])l=i;                else r=i;                if(a[i]==mi)fi=1;                else fa=1;            }            if(fa&&fi) {                ans=(ans+(ll)(n-r)*(l-1-k)%mod+1+(n-r)+(l-1-k))%mod;                if(a[l]==mi)fi=0;                else     fa=0;                k=l;                l=r;                continue;            }        }        sort(a+1,a+n+1);        ll res=0;        int i=2,ii=1;        while(i<n&&a[i]==a[1])i++,ii++;        int j=n-1,jj=1;        while(a[j]==a[n]&&j>=1)j--,jj++;        res=(p[ii]-1)*(p[jj]-1)%mod*(p[n-jj-ii])%mod;///不连续的        printf("%lld %lld\n",ans,res);    }    return 0;}



0 0