BOJ 2433 - The Sound of Silence

image.png

단순히 구간의 최대값과 최소값을 슬라이딩 윈도우로 관리하는 문제이다.

Sparse Table을 이용해도, 덱으로 슬라이딩 윈도우를 해도, 세그먼트 트리를 이용해도 된다.

void solve() {
   int n, m, c;
   cin >> n >> m >> c;
   vi a(n);
   fv(a);
   deque<int> mx, mn;

   vi ans;
   for (int i = 0; i < m; i++) {
      while (sz(mx) && a[mx.back()] < a[i])mx.pop_back();
      while (sz(mn) && a[mn.back()] > a[i])mn.pop_back();

      mx.push_back(i);
      mn.push_back(i);
   }
   if (a[mx[0]] - a[mn[0]] <= c) ans.pb(0);

   for (int i = 1; i + m - 1 < n; i++) {
      while (sz(mx) && mx.front() < i) mx.pop_front();
      while (sz(mn) && mn.front() < i) mn.pop_front();
      while (sz(mx) && a[mx.back()] < a[i + m - 1])mx.pop_back();
      while (sz(mn) && a[mn.back()] > a[i + m - 1])mn.pop_back();
      mx.pb(i + m - 1);
      mn.pb(i + m - 1);
      if (a[mx[0]] - a[mn[0]] <= c) ans.pb(i);
   }

   if (sz(ans) == 0) cout << "NONE";
   else for (int i: ans) cout << i + 1 << endl;
}

Tags:

Categories:

Updated:

Comments