2019CCPC哈尔滨 Interesting Permutation(思维)

首先约束不成立情况,因为他是最大值减最小值,所以对于成立的h来说,h1等于0,h[n]=n-1,并且h[i]>=h[i-1]。

其次我们需要计算的是合法的排列。对于h[i]>h[i-1],显然a[i]是当前的最大值或者最小值,因此答案值*2,并且多出了h[i]-h[i-1]-1个空位,这个空位的意思时,选这些空位不会改变h[i]。

因此当h[i]==h[i-1],就是我们选择了空位,所以答案乘以空位数,因为我们选择了他,所以空位数--

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+10;
const int mod=1e9+7;
int h[N];
int main(){
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        int i;
        for(i=1;i<=n;i++){
            cin>>h[i];
        }
        int ok=0;
        for(i=1;i<=n;i++){
            if(i==1){
                if(h[1]!=0){
                    ok=1;
                    break;
                }
            }
            else if(i==n){
                if(h[i]>=n){
                    ok=1;
                    break;
                }
            }
            else{
                if(h[i]<h[i-1]){
                    ok=1;
                    break;
                }
            }
        }
        if(ok){
            cout<<0<<endl;
            continue;
        }
        else{
            ll ans=1;
            ll cnt=0;
            for(i=2;i<=n;i++){
                if(h[i]>h[i-1]){
                    ans=ans*2%mod;
                    cnt+=(h[i]-h[i-1]-1);
                }
                else{
                    ans=(ans*cnt)%mod;
                    cnt--;
                }
            }
            cout<<ans<<endl;
        }
    }
}
View Code

 

posted @ 2020-08-19 23:14  朝暮不思  阅读(476)  评论(0编辑  收藏  举报