제출 #1330447

#제출 시각아이디문제언어결과실행 시간메모리
1330447SpyrosAliv송신탑 (IOI22_towers)C++20
0 / 100
237 ms4680 KiB
#include "towers.h"
#include <bits/stdc++.h>
using namespace std;

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;
int n;
vector<int> h, ptr;

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

int max_towers(int L, int R, int D) {
  assert(D == 1);
  if (R - L + 1 <= 2) return 1;
  int tot = seg1.query(L+1, R-1);
  return tot+1;
}
#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...