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. template<typename T>
  12. void maximize(T& a, const T& b) {
  13. if (a < b) a = b;
  14. }
  15.  
  16. // ans[x] = Đáp án cho độ dài x
  17. // Nhận xét:
  18. // ans[x] có thể dùng để update cho các ans[x'] với x' < x
  19. // => Thử cho từng a(i) làm giá trị min (1 <= i <= n)
  20. // Sau đó tìm đoạn [l, r] dài nhất chứa i thoả mãn a(i) là min của đoạn [l, r]
  21. const int N = 2e5 + 5;
  22.  
  23. int n;
  24. int a[N];
  25.  
  26. int l[N]; // l[i] = Phần tử gần nhất bên trái < a[i]
  27. int r[N]; // r[i] = Phần tử gần nhất bên phải < a[i]
  28. int ans[N];
  29.  
  30. int main() {
  31. ios::sync_with_stdio(false);
  32. cin.tie(nullptr);
  33. cin >> n;
  34. for (int i = 1; i <= n; i++) cin >> a[i];
  35.  
  36. vector<int> st;
  37. for (int i = 1; i <= n; i++) {
  38. while (!st.empty() && a[st.back()] >= a[i]) st.pop_back();
  39. l[i] = st.empty() ? 0 : st.back();
  40. st.push_back(i);
  41. }
  42.  
  43. st.clear();
  44. for (int i = n; i >= 1; i--) {
  45. while (!st.empty() && a[st.back()] >= a[i]) st.pop_back();
  46. r[i] = st.empty() ? n + 1 : st.back();
  47. st.push_back(i);
  48. }
  49.  
  50. for (int i = 1; i <= n; i++) {
  51. int len = r[i] - l[i] - 1;
  52. maximize(ans[len], a[i]);
  53. }
  54.  
  55. for (int len = n - 1; len >= 1; len--) {
  56. maximize(ans[len], ans[len + 1]);
  57. }
  58.  
  59. for (int len = 1; len <= n; len++) {
  60. cout << ans[len] << ' ';
  61. }
  62. }
Success #stdin #stdout 0.01s 5624KB
stdin
10
1 2 3 4 5 4 3 2 1 6
stdout
6 4 4 3 3 2 2 1 1 1