Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.62 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std ;
  4.  
  5. const int MAX = 1e5 + 10 ;
  6.  
  7. int arr[MAX] , dp[MAX] ;
  8. long long dpways[MAX] ;
  9. int n ;
  10.  
  11. struct segment_tree
  12. {
  13.     vector<int>v ;
  14.     vector<long long> tree ;
  15.     int sz ;
  16.     bool flag ;
  17.     void init(vector<int>v2 , bool t)
  18.     {
  19.         if(t == 0)
  20.             flag = 0 ;
  21.         else
  22.             flag = 1 ;
  23.         sz = (int)v2.size() ;
  24.         v = v2 ;
  25.         sort(v.begin() , v.end()) ;
  26.         tree.resize(sz*4+10) ;
  27.         for(int i = 0 ; i <= sz*4 ; ++i)
  28.             tree[i] = 0 ;
  29.     }
  30.     int getidx1(int idx)
  31.     {
  32.         int idx2 = lower_bound(v.begin() , v.end() , idx) - v.begin() ;
  33.         return idx2 ;
  34.     }
  35.     int getidx2(int idx)
  36.     {
  37.         int idx2 = lower_bound(v.begin() , v.end() , idx) - v.begin() ;
  38.         idx2-- ;
  39.         return idx2 ;
  40.     }
  41.     void update(int node , int l , int r , int idx , long long v)
  42.     {
  43.         if(idx > r || idx < l || idx < 0)
  44.             return ;
  45.         if(l == r)
  46.         {
  47.             if(flag == 0)
  48.                 tree[node] = max(tree[node] , v) ;
  49.             else
  50.                 tree[node] = v ;
  51.             return ;
  52.         }
  53.         int mid = (l + r) >> 1 ;
  54.         update(node << 1 , l , mid , idx , v) ;
  55.         update(node << 1 | 1 , mid+1 , r , idx , v) ;
  56.         if(flag == 0)
  57.             tree[node] = max(tree[node << 1] , tree[node << 1 | 1]) ;
  58.         else
  59.             tree[node] = tree[node << 1] + tree[node << 1 | 1] ;
  60.     }
  61.  
  62.     long long query(int node , int l , int r , int from , int to)
  63.     {
  64.         if(from > r || to < l || from > to)
  65.             return 0 ;
  66.         if(l >= from && r <= to)
  67.             return tree[node] ;
  68.         int mid = (l + r) >> 1 ;
  69.         long long a = query(node << 1 , l , mid , from , to) ;
  70.         long long b = query(node << 1 | 1 , mid+1 , r , from , to) ;
  71.         if(flag == 0)
  72.             return max(a , b) ;
  73.         else
  74.             return (a + b) ;
  75.     }
  76.  
  77.     void update(int idx , long long val)
  78.     {
  79.         idx = getidx1(idx) ;
  80.         update(1 , 0 , sz , idx , val) ;
  81.     }
  82.  
  83.     int query(int idx)
  84.     {
  85.         idx = getidx2(idx) ;
  86.         return query(1 , 0 , sz , 0 , idx) ;
  87.     }
  88. };
  89.  
  90. vector< vector<int> >LIS(MAX) ;
  91.  
  92. int main()
  93. {
  94.     ios_base::sync_with_stdio(0) ;
  95.     cin.tie(0) ;
  96.     cin>>n ;
  97.     vector<int>v ;
  98.     for(int i = 0 ; i < n ; ++i)
  99.     {
  100.         cin>>arr[i] ;
  101.         v.push_back(arr[i]) ;
  102.     }
  103.     segment_tree st ;
  104.     st.init(v , 0) ;
  105.     int Max = 0 ;
  106.     for(int i = 0 ; i < n ; ++i)
  107.     {
  108.         dp[i] = st.query(arr[i]) + 1 ;
  109.         Max = max(Max , dp[i]) ;
  110.         st.update(arr[i] , dp[i]) ;
  111.         LIS[dp[i]].push_back(arr[i]) ;
  112.     }
  113.     vector<segment_tree>tree(n+1) ;
  114.     for(int i = 1 ; i <= n ; ++i)
  115.     {
  116.         if(LIS[i].size() > 0)
  117.             tree[i].init(LIS[i] , 1) ;
  118.     }
  119.     long long ans = 0ll ;
  120.     for(int i = 0 ; i < n ; ++i)
  121.     {
  122.         if(dp[i] == 1)
  123.             dpways[i] = 1ll ;
  124.         else
  125.             dpways[i] = tree[dp[i]-1].query(arr[i]) ;
  126.         tree[dp[i]].update(arr[i] , dpways[i]) ;
  127.         if(dp[i] == Max)
  128.             ans += dpways[i] ;
  129.     }
  130.     return cout<<ans<<"\n" , 0 ;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement