제출 #1366778

#제출 시각아이디문제언어결과실행 시간메모리
1366778mannshah1211Radio Towers (IOI22_towers)C++20
23 / 100
4067 ms220016 KiB
#include "towers.h"
#include <bits/stdc++.h>
#include <vector>

using namespace std;

class twodfenwick {
 public:
  map<pair<int, int>, int> mp;
  int n, m;

  twodfenwick(int _n, int _m) : n(_n), m(_m) {}

  void modify(int x, int y, int d) {
    while (x < n) {
      int yy = y;
      while (y < n) {
        mp[make_pair(x, y)] = max(mp[make_pair(x, y)], d);
        y |= (y + 1);
      }
      y = yy;
      x |= (x + 1);
    }
  }

  int mx(int x, int y) {
    int ans = 0;
    while (x >= 0) {
      int yy = y;
      while (y >= 0) {
        ans = max(ans, mp[make_pair(x, y)]);
        y = (y & (y + 1)) - 1;
      }
      y = yy;
      x = (x & (x + 1)) - 1;
    }
    return ans;
  }
};

vector<int> hh;

void init(int n, vector<int> h) {
  hh = h;
}

int max_towers(int l, int r, int d) {
  vector<int> x;
  x.push_back(0);
  for (int i = l; i <= r; i++) {
    x.push_back(hh[i]);
  }
  int n = r - l + 1;
  vector<vector<int>> spt(x.size(), vector<int>(20));
  for (int i = 0; i < x.size(); i++) {
    spt[i][0] = x[i];
  }
  for (int j = 1; j < 20; j++) {
    for (int i = 0; i < x.size(); i++) {
      if (i + (1 << j) - 1 >= x.size()) {
        spt[i][j] = -1;
      } else {
        spt[i][j] = max(spt[i][j - 1], spt[i + (1 << (j - 1))][j - 1]);
      }
    }
  }
  auto range = [&](int l, int r) -> int {
    int log = __lg(r - l + 1);
    return max(spt[l][log], spt[r - (1 << log) + 1][log]);
  };
  vector<int> nxt(n + 1, n + 1), prv(n + 1, -1);
  for (int i = 1; i <= n; i++) {
    int low = 1, high = i, idx = -1;
    while (low <= high) {
      int mid = (low + high) >> 1;
      if (range(mid, i) >= x[i] + d) {
        idx = mid;
        low = mid + 1;
      } else {
        high = mid - 1;
      }
    }
    if (idx != -1) {
      prv[i] = idx;
    }
  }
  for (int i = 1; i <= n; i++) {
    int low = i, high = n, idx = -1;
    while (low <= high) {
      int mid = (low + high) >> 1;
      if (range(i, mid) >= x[i] + d) {
        idx = mid;
        high = mid - 1;
      } else {
        low = mid + 1;
      }
    }
    if (idx != -1) {
      nxt[i] = idx;
    }
  }
  twodfenwick fenw(n + 1, n + 1);
  vector<int> dp(n + 1);
  for (int i = 1; i <= n; i++) {
    dp[i] = 1;
    if (prv[i] != -1) {
      dp[i] = max(dp[i], fenw.mx(i, prv[i]) + 1);
    }
    if (nxt[i] != n + 1) {
      fenw.modify(nxt[i], i, dp[i]);
    }
  }
  return *max_element(dp.begin(), dp.end());
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…