Advertisement
MinhNGUYEN2k4

NTSEQ

Mar 19th, 2021
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. //Nguyen Huu Hoang Minh
  2. #include <bits/stdc++.h>
  3. #define sz(x) int(x.size())
  4. #define all(x) x.begin(),x.end()
  5. #define reset(x) memset(x, 0,sizeof(x))
  6. #define pb push_back
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define N 100050
  11. #define remain(x) if (x > MOD) x -= MOD
  12. #define ii pair<int, int>
  13. #define iiii pair< ii , ii >
  14. #define viiii vector< iiii >
  15. #define vi vector<int>
  16. #define vii vector< ii >
  17. #define bit(x, i) (((x) >> (i)) & 1)
  18. #define Task "test"
  19. #define int long long
  20.  
  21. using namespace std;
  22.  
  23. typedef long double ld;
  24. const int inf = 1e10;
  25. const int minf = -1e10;
  26. const int mod = 1000000007;
  27.  
  28. int n, a[N];
  29. ii bit[N];
  30.  
  31. void readfile()
  32. {
  33.     ios_base::sync_with_stdio(false);
  34.     cin.tie(0);cout.tie(0);
  35.     if (fopen(Task".inp","r"))
  36.     {
  37.         freopen(Task".inp","r",stdin);
  38.         //freopen(Task".out","w",stdout);
  39.     }
  40.     cin >> n;
  41.     for(int i=1; i<=n; i++) cin >> a[i];
  42. }
  43.  
  44. void compress()
  45. {
  46.     set<int> s(a+1,a+1+n);
  47.     vector<int> b(s.begin(),s.end());
  48.     for(int i=1; i<=n; i++)
  49.     {
  50.         int x = a[i];
  51.         int k = lower_bound(b.begin(),b.end(),x)-b.begin()+1;
  52.         a[i] = k;
  53.     }
  54. }
  55.  
  56. ii get(int x)
  57. {
  58.     ii ans = ii(0,0);
  59.     for(; x > 0; x -= x & -x)
  60.     {
  61.         if (bit[x].fi > ans.fi)
  62.         {
  63.             ans = bit[x];
  64.         }
  65.         else if (bit[x].fi == ans.fi)
  66.         {
  67.             ans.se = (ans.se + bit[x].se)%mod;
  68.         }
  69.     }
  70.     if (ans.fi==0) return ii(1,1);
  71.     else ans.fi++;
  72.     return ans;
  73. }
  74.  
  75. void up(int x, ii val)
  76. {
  77.     for(; x <= N; x += x & -x)
  78.     {
  79.         if (val.fi > bit[x].fi)
  80.         {
  81.             bit[x] = val;
  82.         }
  83.         else if (bit[x].fi == val.fi){
  84.             bit[x].se = (bit[x].se + val.se)%mod;
  85.         }
  86.     }
  87. }
  88.  
  89. void proc()
  90. {
  91.     compress();
  92.     for(int i=1; i<=n; i++)
  93.     {
  94.         ii p = get(a[i]-1);
  95.         up(a[i],p);
  96.     }
  97.     cout << get(N-1).se;
  98. }
  99.  
  100. signed main()
  101. {
  102.     readfile();
  103.     proc();
  104.     return 0;
  105. }
  106.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement