Sliding window: there are two pointers L,R. Add a number r to move to the right, and subtract a number L to move to the right.
Generally, it is necessary to maintain the maximum or minimum value in the window, and the query complexity can be O (1).
Generally, two-way queue assistance is needed, such as Title: sliding window
Suppose it is a window that needs to maintain the maximum value, then the array in the two-way queue should be "large - > small",
In order to meet this condition, when the number x is added later, the number less than or equal to x needs to be ejected and then pushed into the bidirectional queue,
Why do I need to pop up the equal? Because the subscript of x must be larger than that of the pop-up number, so the expiration time of x is later than that of the previous one. That's not so good
Pop up the same number of early expirations.
When maintaining a sliding window, it is usually necessary to consider whether the maximum or minimum value in the current queue expires.
1 #include <iostream> 2 #include <algorithm> 3 #include <deque> 4 5 using namespace std; 6 7 void solve(){ 8 9 int N, K; 10 cin >> N >> K; 11 deque<int > Min; 12 deque<int > Max; 13 vector<int > ans[2]; 14 vector<int > arr(N); 15 for(auto& it : arr) cin >> it; 16 // for(auto x : arr) cout << x << " "; 17 // cout << endl; 18 //Pressing a subscript can index the value of an array 19 for(int i = 0; i < N; ++i){ 20 while(!Min.empty() && arr[Min.back()] >= arr[i]) Min.pop_back(); 21 while(!Max.empty() && arr[Max.back()] <= arr[i]) Max.pop_back(); 22 Min.push_back(i); 23 Max.push_back(i); 24 if(i >= K - 1){ 25 while(!Min.empty() && Min.front() + K - 1 < i ) Min.pop_front(); //Minimum expired 26 while(!Max.empty() && Max.front() + K - 1 < i ) Max.pop_front(); //Maximum expired 27 if(Min.empty() || Max.empty()) cout << "error" << endl; 28 ans[0].push_back(arr[Max.front()]); 29 ans[1].push_back(arr[Min.front()]); 30 } 31 } 32 for(auto x : ans[1]) cout << x << " "; 33 cout << endl; 34 for(auto x : ans[0]) cout << x << " "; 35 cout << endl; 36 } 37 38 int main(){ 39 40 ios::sync_with_stdio(false); 41 cin.tie(0); 42 cout.tie(0); 43 solve(); 44 45 return 0; 46 }