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 = 2e5 + 5;
  12.  
  13. int n;
  14. int a[N];
  15.  
  16. int l[N]; // l[i] = phần tử gần nhất bên trái < a[i]
  17.  
  18. int main() {
  19. ios::sync_with_stdio(false);
  20. cin.tie(nullptr);
  21. cin >> n;
  22. for (int i = 1; i <= n; i++) cin >> a[i];
  23.  
  24. // Duyệt từ trái sang và duy trì một stack
  25. // Khi xét đến i, gọi j là phần tử ở đỉnh của stack
  26. // Nếu a[j] >= a[i] thì việc giữ j lại không có ý nghĩa gì cả
  27. // vì i vừa gần với những chỉ số phía sau hơn đồng thời a[i] cũng "tốt" hơn a[j]
  28. // nên trường hợp này ta pop j ra khỏi stack
  29. // Lặp lại đến khi stack rỗng hoặc a[j] < a[i]
  30. // Lúc này j chính là đáp án l[i] cần tìm
  31. // - Note: Điều này cũng có thể diễn đạt lại theo một cách khác là:
  32. // - Ở mỗi thời điểm ta luôn giữ cho stack giảm nghiêm ngặt tính từ đỉnh xuống
  33. vector<int> st;
  34. for (int i = 1; i <= n; i++) {
  35. while (!st.empty() && a[st.back()] >= a[i]) st.pop_back();
  36. l[i] = st.empty() ? 0 : st.back();
  37. st.push_back(i);
  38. }
  39.  
  40. for (int i = 1; i <= n; i++) cout << l[i] << ' ';
  41. }
Success #stdin #stdout 0s 5280KB
stdin
8
2 5 1 4 8 3 2 5
stdout
0 1 0 3 4 3 3 7