Advertisement
Guest User

Untitled

a guest
Feb 16th, 2020
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define _ ios_base::sync_with_stdio(0);cin.tie(0);
  6. #define endl '\n'
  7. #define pb push_back
  8. #define f first
  9. #define s second
  10.  
  11. typedef long long ll;
  12.  
  13. const int MAX = 1e6+10;
  14. const int MOD = 1e9+7;
  15. const int inf = 0x3f3f3f3f;
  16.  
  17. int seg[2*MAX];
  18. int fat[2*MAX];
  19. int n;
  20. int maxi = 0;
  21. vector<vector<int>> w(MAX);
  22.  
  23. ll fexp(ll x, ll y){
  24.     ll ret = 1;
  25.     while(y){
  26.         if(y&1) ret = (ret*x) %MOD;
  27.         y >>=1;
  28.         x = (x*x)%MOD;
  29.     }
  30.     return ret;
  31. }
  32.  
  33. ll inv(ll x){
  34.     return fexp(x, MOD-2);
  35. }
  36.  
  37. void fat_build(){
  38.     for(ll i=2; i<2*MAX; i++)
  39.         fat[i] = ((ll)fat[i-1]*i)%MOD;
  40. }
  41.  
  42. // cat(n) = (2*n)!/ ((n+1)! * n!)
  43. ll cat(ll x){
  44.     if(x==1) return 1;
  45.     return fat[2*x]%MOD * inv(fat[x+1])%MOD * inv(fat[x])%MOD;
  46. }
  47.  
  48. int build(){
  49.     for(int i=n-1; i; i--) seg[i] = min(seg[2*i], seg[2*i+1]);
  50. }
  51.  
  52. int query(int a, int b){
  53.     int ret = inf;
  54.     for(a +=n, b+=n; a<=b; ++a /= 2, --b/=2){
  55.         ret = min(ret, seg[a]);
  56.         ret = min(ret, seg[b]);
  57.     }
  58.     return ret;
  59. }
  60.  
  61. int main(){ _
  62.     fat[0] = fat[1] = 1;
  63.     fat_build();
  64.    
  65.     cin >> n;
  66.     if(n==0){
  67.         cout << 1 << endl;
  68.         exit(0);
  69.     }
  70.     for(int i=0; i<n; i++){
  71.         cin >> seg[n+i];
  72.         w[seg[n+i]].pb(i);
  73.     }
  74.  
  75.     build();
  76.  
  77.     ll ret = 1, at = 1;
  78.     for(int i=0; i<MAX; i++){
  79.         if(w[i].size()<2) continue;
  80.         for(int j=0; j<w[i].size()-1; j++){
  81.         //  cout << "num " << i << " " << j << endl;
  82.         //  cout << "inter " << w[i][j] << " " << w[i][j+1] << endl;
  83.            
  84.             int q = query(w[i][j], w[i][j+1]);
  85.     //      cout << i << " " << w[i][j] << " " << q << endl;
  86.             if(q<i){
  87.                 ret = (ret*cat(at))%MOD;
  88.                 at = 1;
  89.             }
  90.             else{
  91.                 at++;
  92.             }
  93.         }
  94.         ret = (ret*cat(at))%MOD;
  95.         at = 1;
  96.     }
  97.    
  98.     cout << ret << endl;
  99.  
  100.     exit(0);
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement