Advertisement
Dang_Quan_10_Tin

GROWING UP IS HARD TO DO

Oct 19th, 2022 (edited)
932
-1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 1
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <vector>
  5.  
  6. using namespace std;
  7. using ll = long long;
  8.  
  9. constexpr int N = 3e5 + 5;
  10. constexpr ll mod = 1e9 + 7;
  11. constexpr int Inf = 1e9 + 7;
  12.  
  13. int n, a[N];
  14. ll dp[N], f[N];
  15.  
  16. vector<int> b[N];
  17. vector<ll> sum[N];
  18.  
  19. void Read()
  20. {
  21.     cin >> n;
  22.  
  23.     for (int i = 1; i <= n; ++i)
  24.         cin >> a[i];
  25. }
  26.  
  27. void Solve()
  28. {
  29.     a[n + 1] = Inf;
  30.  
  31.     b[0].emplace_back(0);
  32.     sum[0].emplace_back(dp[0] = 1);
  33.  
  34.     for (int i = 1; i <= n; ++i)
  35.     {
  36.         b[i].emplace_back(n + 1);
  37.         sum[i].emplace_back(0);
  38.     }
  39.  
  40.     int ans(0);
  41.  
  42.     for (int i = 1; i <= n; ++i)
  43.     {
  44.         b[n + 1].clear();
  45.         b[n + 1].emplace_back(i);
  46.         // Calculate longgest increasing subsequence
  47.         int j = lower_bound(b + 1, b + n + 1, b[n + 1], [&](const vector<int> &u, const vector<int> &v)
  48.                             { return a[u.back()] < a[v.back()]; }) -
  49.                 b;
  50.  
  51.         // Calculate dp
  52.         if (j == 1)
  53.             dp[i] = 1;
  54.         else
  55.         {
  56.             int l = lower_bound(b[j - 1].begin(), b[j - 1].end(), i, [&](const int &x, const int &y)
  57.                                 { return a[x] > a[y] || (a[x] == a[y] && x < y); }) -
  58.                     b[j - 1].begin();
  59.  
  60.             dp[i] = (sum[j - 1].back() - sum[j - 1][l - 1]) % mod; // sum[j - 1][l - 1] == sum[j - 1][h]
  61.         }
  62.  
  63.         if (a[b[j].back()] == a[i])
  64.             f[i] = (dp[i] - dp[b[j].back()]) % mod;
  65.         else
  66.             f[i] = dp[i];
  67.  
  68.         ans = max(ans, j);
  69.  
  70.         b[j].emplace_back(i);
  71.         sum[j].emplace_back((sum[j].back() + f[i]) % mod);
  72.     }
  73.  
  74.     cout << (sum[ans].back() + mod) % mod;
  75. }
  76. int32_t main()
  77. {
  78.     ios_base::sync_with_stdio(0);
  79.     cin.tie(0);
  80.     cout.tie(0);
  81.     Read();
  82.     Solve();
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement