单调栈利用栈实现单调化,求解问题的方式
单调栈可以求取最近的两边比自己大或者小的位置,再盛水和挡板类问题又应用,一般使用数组来替代stack容器
1 int arr[N]; 2 int s[N]; 3 int total=0; 4 int main(){ 5 ioscin; 6 int n; 7 cin>>n; 8 int ans=0; 9 for(int i=1;i<=n;++i){ 10 cin>>arr[i]; 11 while(total&&s[total]<arr[i]){ 12 total--; 13 ans++; 14 } 15 if(total) 16 ans++; 17 s[++total]=arr[i]; 18 } 19 cout<<ans<<endl; 20 return 0; 21 } 22 //单调栈,用于解决找两边比他大或者比他小的数。
单调队列,用来求取区间最值
1 int arr[N]; 2 deque<int>da; 3 deque<int>x; 4 int main(){ 5 int n,k; 6 cin>>n>>k; 7 for(int i=0;i<n;++i){ 8 cin>>arr[i]; 9 } 10 for(int i=0;i<k;++i){ 11 while(!x.empty()&&arr[x.back()]>arr[i]){ 12 x.pop_back(); 13 } 14 x.push_back(i); 15 } 16 cout<<arr[x.front()]<<' '; 17 for(int l=1;l+k<=n;++l){ 18 while(!x.empty()&&arr[x.back()]>arr[l+k-1]){ 19 x.pop_back(); 20 } 21 x.push_back(l+k-1); 22 while(x.front()<l){ 23 x.pop_front(); 24 } 25 cout<<arr[x.front()]<<' '; 26 } 27 cout<<endl; 28 for(int i=0;i<k;++i){ 29 while(!da.empty()&&arr[da.back()]<arr[i]){ 30 da.pop_back(); 31 } 32 da.push_back(i); 33 } 34 cout<<arr[da.front()]<<' '; 35 for(int l=1;l+k<=n;++l){ 36 while(!da.empty()&&arr[da.back()]<arr[l+k-1]){ 37 da.pop_back(); 38 } 39 da.push_back(l+k-1); 40 while(da.front()<l){ 41 da.pop_front(); 42 } 43 cout<<arr[da.front()]<<' '; 44 } 45 return 0; 46 } 47 //单调队列,用以解决区间最大或最小值问题 48 //两者储存的都是下标,而不是值,比较时要注意
浙公网安备 33010602011771号