Advertisement
MathQ_

Untitled

Feb 27th, 2021
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.21 KB | None | 0 0
  1. const ll p = 1e9 + 7;
  2.  
  3. struct seg_tree {
  4.     vector<ll> maxs;
  5.     vector<ll> cnt;
  6.  
  7.     seg_tree(ll n) {
  8.         maxs.resize(4 * n, 0);
  9.         cnt.resize(4 * n, 0ll);
  10.     }
  11.  
  12.     pair<ll, ll> get_max(ll id, ll l, ll r, ll lq, ll rq) {
  13.         if (lq >= r || l >= rq) {
  14.             return {0, 0ll};
  15.         }
  16.         if (lq <= l && r <= rq) {
  17.             return {maxs[id], cnt[id] % p};
  18.         }
  19.         ll m = (l + r) / 2;
  20.         pair<ll, ll> m1 = get_max(id * 2 + 1, l, m, lq, rq);
  21.         pair<ll, ll> m2 = get_max(id * 2 + 2, m, r, lq, rq);
  22.         if (m1.fi != m2.fi) {
  23.             return max(m1, m2);
  24.         } else {
  25.             return {m1.fi, (m1.se % p + m2.se % p) % p};
  26.         }
  27.     }
  28.  
  29.     void update(ll id, ll l, ll r, ll i, ll x, ll y) {
  30.         if (l + 1 == r) {
  31.             maxs[id] = x;
  32.             cnt[id] += y % p;
  33.             cnt[id] %= p;
  34.             return;
  35.         }
  36.         ll m = (l + r) / 2;
  37.         if (i < m) {
  38.             update(id * 2 + 1, l, m, i, x, y);
  39.         } else {
  40.             update(id * 2 + 2, m, r, i, x, y);
  41.         }
  42.         maxs[id] = max(maxs[id * 2 + 1], maxs[id * 2 + 2]);
  43.         if (maxs[id * 2 + 1] != maxs[id * 2 + 2]) {
  44.             cnt[id] = (maxs[id * 2 + 1] > maxs[id * 2 + 2] ? cnt[id * 2 + 1] : cnt[id * 2 + 2]) % p;
  45.         } else {
  46.             cnt[id] = (cnt[id * 2 + 1] % p + cnt[id * 2 + 2] % p) % p;
  47.         }
  48.     }
  49. };
  50.  
  51. int main() {
  52.     ll n;
  53.     cin >> n;
  54.     vector<ll> a(n);
  55.     cin >> a;
  56.  
  57.     map<ll, ll> crds;
  58.     set<ll> b;
  59.     for (auto el : a) {
  60.         b.insert(el);
  61.     }
  62.     ll cnt = 0;
  63.     for (auto el : b) {
  64.         crds[el] = cnt++;
  65.     }
  66.    
  67.     ll m = b.size();
  68.     seg_tree s(m);
  69.  
  70.     vector<pair<ll, ll>> dp(n, {1, 1});
  71.     s.update(0, 0, m, crds[a[0]], 1, 1);
  72.  
  73.     for (ll i = 1; i < n; ++i) {
  74.         pair<ll, ll> ans = s.get_max(0, 0, m, 0, crds[a[i]]);
  75.         dp[i].fi = ans.fi + 1;
  76.         dp[i].se = max(dp[i].se, ans.se);
  77.         s.update(0, 0, m, crds[a[i]], dp[i].fi, dp[i].se);
  78.     }
  79.  
  80.     int d = (*max_element(all(dp))).fi;
  81.     ll ans = 0;
  82.     for (int i = 0; i < n; ++i) {
  83.         if (dp[i].fi == d) ans += dp[i].se;
  84.         ans %= p;
  85.     }
  86.     cout << ans % p << '\n';
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement