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; } } }
没有人不辛苦,只有人不喊疼