제출 #1330448

#제출 시각아이디문제언어결과실행 시간메모리
1330448SpyrosAlivRadio Towers (IOI22_towers)C++20
14 / 100
323 ms4716 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] = 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 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);
  }
};

void dbg(vector<int> xx) {
  /*
  cout << "DBG: ";
  for (auto x: xx) cout << x << " ";
  cout << "\n";*/
}

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);
      dbg({i});
    }
  }
}

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);
  dbg({L+1, R-1, tot});
  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...