제출 #1330435

#제출 시각아이디문제언어결과실행 시간메모리
1330435SpyrosAlivRadio Towers (IOI22_towers)C++20
23 / 100
4062 ms6252 KiB
#include "towers.h"
#include <bits/stdc++.h>
using namespace std;

int n;
vector<int> h;

class segTree {
  int n;
  vector<int> seg;
  void upd(int node, int start, int end, int idx, int v) {
    if (start == end) {
      seg[node] = v;
    }
    else {
      int mid = (start + end) / 2;
      if (idx <= mid) upd(node*2, start, mid, idx, v);
      else upd(node*2+1, mid+1, end, idx, v);
      seg[node] = max(seg[node*2], seg[node*2+1]);
    }
  } 
  int query(int node, int start, int end, int l, int r) {
    if (start > r || end < l) return 0;
    else if (start >= l && end <= r) return seg[node];
    else {
      int mid = (start + end) / 2;
      return max(query(node*2, start, mid, l, r), query(node*2+1, mid+1, end, l, r));
    }
  }
  public:
  void initt(int nn) {
    n = nn;
    seg.assign(4*(n+1), 0);
  }
  void upd(int idx, int v) {
    upd(1, 0, n-1, idx, v);
  }
  int query(int l, int r) {
    if (l > r) return 0;
    return query(1, 0, n-1, l, r);
  }
};

segTree seg1, seg2;

void init(int N, std::vector<int> H) {
  n = N;
  h = H;
  seg1.initt(n);
  seg2.initt(n);
  for (int i = 0; i < n; i++) {
    seg2.upd(i, h[i]);
  }
}

int max_towers(int L, int R, int D) {
  vector<int> dp(n, 1);
  int ans = 1;
  int d = D;
  priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
  for (int i = L; i <= R; i++) {
    int lo = L+1, hi = i-1;
    int fin = -1;
    while (lo <= hi) {
      int mid = (lo + hi) / 2;
      int mx = seg2.query(mid, i-1);
      if (h[i] + d <= mx) {
        fin = mid;
        lo = mid+1;
      }
      else {
        hi = mid-1;
      }
    }
    if (fin != -1) {
      dp[i] = max(dp[i], seg1.query(L, fin-1) + 1);
    }
    while (!pq.empty() && pq.top().first + d <= h[i]) {
      int idx = pq.top().second;
      pq.pop();
      seg1.upd(idx, dp[idx]);
    }
    pq.push({h[i], i});
    ans = max(ans, dp[i]);
  }
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...