Advertisement
Dang_Quan_10_Tin

LINEUP.cpp

Mar 17th, 2022
726
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1. #define task "LINEUP"
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. using ll = long long;
  9. using ld = long double;
  10.  
  11. constexpr int N = 3e6 + 5;
  12. constexpr ll mod = 1e9 + 7;
  13. int n, a[N];
  14. ll f[N], g[N];
  15.  
  16. void Read()
  17. {
  18.     cin >> n;
  19.  
  20.     for (int i = 1; i <= n; ++i)
  21.         cin >> a[i];
  22. }
  23.  
  24. void Sub_1()
  25. {
  26.     f[n + 1] = 1;
  27.  
  28.     for (int i = n; i; --i)
  29.         for (int j = i + 1; j <= n + 1; ++j)
  30.         {
  31.             for (int t = i + 1; t < j; ++t)
  32.                 if (a[i] < a[t])
  33.                     goto done;
  34.  
  35.             (f[i] += f[j]) %= mod;
  36.         done:;
  37.         }
  38.  
  39.     cout << f[1];
  40. }
  41.  
  42. void Sub_2()
  43. {
  44.     f[n + 1] = 1;
  45.  
  46.     for (int i = n, j; i; --i)
  47.     {
  48.         j = i;
  49.         while (j <= n && a[j] <= a[i])
  50.             (f[i] += f[++j]) %= mod;
  51.     }
  52.  
  53.     cout << f[1];
  54. }
  55.  
  56. void Sub_4()
  57. {
  58.     vector<int> s;
  59.     f[n + 1] = g[n + 1] = 1;
  60.  
  61.     for (int i = n; i; --i)
  62.     {
  63.         while (!s.empty() && a[s.back()] <= a[i])
  64.             s.pop_back();
  65.  
  66.         f[i] = (g[i + 1] - (s.empty() ? 0 : g[s.back() + 1])) % mod;
  67.  
  68.         s.emplace_back(i);
  69.  
  70.         g[i] = (g[i + 1] + f[i]) % mod;
  71.     }
  72.  
  73.     cout << (f[1] + mod) % mod;
  74. }
  75.  
  76. int32_t main()
  77. {
  78.     ios_base::sync_with_stdio(0);
  79.     cin.tie(0);
  80.     cout.tie(0);
  81.  
  82.     if (fopen(task ".INP", "r"))
  83.     {
  84.         freopen(task ".INP", "r", stdin);
  85.         freopen(task ".OUT", "w", stdout);
  86.     }
  87.  
  88.     Read();
  89.     if (n <= 300)
  90.         Sub_1();
  91.     else if (n <= 3000)
  92.         Sub_2();
  93.     else
  94.         Sub_4();
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement