UVALive 5990 Array Diversity

題目鏈接: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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章