Advertisement
pypcdev

Untitled

Sep 28th, 2021
1,038
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int NMAX=2e5;
  5. int a[NMAX+5];
  6.  
  7. int g_left[NMAX+5],g_right[NMAX+5];
  8. int l_left[NMAX+5],l_right[NMAX+5];
  9.  
  10. const int LOG=20;
  11. int dp_left[LOG+2][NMAX+5];
  12. int dp_right[LOG+2][NMAX+5];
  13.  
  14. signed main(){
  15.     ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  16.     int n;
  17.     cin>>n;
  18.     for(int i=1;i<=n;i++)cin>>a[i];
  19.     vector<int>st;
  20.  
  21.     // greater right
  22.     for(int i=1;i<=n;i++){
  23.         while(!st.empty()&&a[st.back()]<a[i])g_right[st.back()]=i,st.pop_back();
  24.         st.push_back(i);
  25.     }
  26.     while(!st.empty())g_right[st.back()]=n+1,st.pop_back();
  27.  
  28.     // less right
  29.     for(int i=1;i<=n;i++){
  30.         while(!st.empty()&&a[st.back()]>a[i])l_right[st.back()]=i,st.pop_back();
  31.         st.push_back(i);
  32.     }
  33.     while(!st.empty())l_right[st.back()]=n+1,st.pop_back();
  34.  
  35.     // greater left
  36.     for(int i=n;i>=1;i--){
  37.         while(!st.empty()&&a[st.back()]<a[i])g_left[st.back()]=i,st.pop_back();
  38.         st.push_back(i);
  39.     }
  40.     while(!st.empty())g_left[st.back()]=0,st.pop_back();
  41.  
  42.     // less left
  43.     for(int i=n;i>=1;i--){
  44.         while(!st.empty()&&a[st.back()]>a[i])l_left[st.back()]=i,st.pop_back();
  45.         st.push_back(i);
  46.     }
  47.     while(!st.empty())l_left[st.back()]=0,st.pop_back();
  48.  
  49.     /*cout<<"GREATER LEFT\n";
  50.     for(int i=1;i<=n;i++)cout<<g_left[i]<<" ";cout<<"\n";
  51.     cout<<"GREATER RIGHT\n";
  52.     for(int i=1;i<=n;i++)cout<<g_right[i]<<" ";cout<<"\n";
  53.     cout<<"LESS LEFT\n";
  54.     for(int i=1;i<=n;i++)cout<<l_left[i]<<" ";cout<<"\n";
  55.     cout<<"LESS RIGHT\n";
  56.     for(int i=1;i<=n;i++)cout<<l_right[i]<<" ";cout<<"\n";*/
  57.  
  58.     for(int i=1;i<=n;i++)dp_left[0][i]=g_left[i];
  59.     for(int i=1;i<=n;i++)dp_right[0][i]=g_right[i];
  60.  
  61.     for(int lvl=1;lvl<=LOG;lvl++){
  62.         for(int i=1;i<=n;i++){
  63.             if(dp_left[lvl-1][i]==0)dp_left[lvl][i]=0;
  64.             else dp_left[lvl][i]=dp_left[lvl-1][dp_left[lvl-1][i]];
  65.             if(dp_right[lvl-1][i]==n+1)dp_right[lvl][i]=n+1;
  66.             else dp_right[lvl][i]=dp_right[lvl-1][dp_right[lvl-1][i]];
  67.  
  68.         }
  69.     }
  70.     long long ans=0;
  71.     for(int i=1;i<=n;i++){
  72.         int L=l_left[i];
  73.         int R=l_right[i];
  74.         int cnt=0,pL=i,pR=i;
  75.         for(int lvl=LOG;lvl>=0;lvl--){
  76.             if(dp_left[lvl][pL]>L)pL=dp_left[lvl][pL],cnt+=(1<<lvl);
  77.             if(dp_right[lvl][pR]<R)pR=dp_right[lvl][pR],cnt+=(1<<lvl);
  78.         }
  79.         ans+=cnt+1;
  80.     }
  81.     cout<<ans<<"\n";
  82.  
  83. }
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement