fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. const int N = 17e3 + 5;
  12.  
  13. int n, k;
  14. int a[N];
  15.  
  16. void solve() {
  17. cin >> n >> k;
  18. for (int i = 1; i <= n; i++) cin >> a[i];
  19.  
  20. // Đây còn gọi là minimum queue
  21. // Nhìn chung ý tưởng tương tự như bên stack, nhưng cần thao tác ở cả 2 đầu nên phải đổi sang deque
  22. // Khi xét đến i, gọi j là phần tử ở cuối deque (dq.back())
  23. // Nếu a[j] > a[i] thì việc giữ j lại không có ý nghĩa gì cả
  24. // Vì i nằm sâu bên trong hơn j đồng thời a[i] cũng "tốt" hơn a[j]
  25. // nên trường hợp này ta pop_back() j ra khỏi deque
  26. // Lặp lại đến khi deque rỗng hoặc a[j] <= a[i]
  27. // => Deque sẽ luôn được sắp xếp tăng dần tại mọi thời điểm
  28. // => Phần tử nhỏ nhất sẽ nằm ở đầu deque (dq.front())
  29. // Nhưng trước khi in ra ta cần loại bỏ (pop_front()) phần tử nằm bên ngoài đoạn truy vấn [i - k + 1, i]
  30. deque<int> dq;
  31. for (int i = 1; i <= n; i++) {
  32. while (!dq.empty() && a[dq.back()] > a[i]) dq.pop_back();
  33. dq.push_back(i);
  34. if (dq.front() == i - k) dq.pop_front();
  35. if (i >= k) cout << a[dq.front()] << ' ';
  36. }
  37. cout << '\n';
  38. }
  39.  
  40. int main() {
  41. ios::sync_with_stdio(false);
  42. cin.tie(nullptr);
  43. int t;
  44. cin >> t;
  45.  
  46. while (t--) {
  47. solve();
  48. }
  49. }
Success #stdin #stdout 0s 5288KB
stdin
2
4 2
3 2 4 1
3 3
1 2 3
stdout
2 2 1 
1