Submission #1238592

#TimeUsernameProblemLanguageResultExecution timeMemory
1238592k1r1t0Radio Towers (IOI22_towers)C++20
23 / 100
4090 ms9628 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 110000;
const int LOGN = 20;
const int INF = (int)(1e9+1);

int n, h[N], opt, dp0[N], dp1[N], dp2[N], l[N], r[N], tt[LOGN][N];

void init(int N, vector<int> H) {
	n = N;
	for (int i = 1; i <= n; i++)
		h[i] = H[i - 1];
}

void upd(int &k, int x) {
	k = max(k, x);
}

int getmax(int l, int r) {
	assert(l <= r); // WTF???
	int sz = 31 - __builtin_clz(r - l + 1);
	return max(tt[sz][l], tt[sz][r - (1 << sz) + 1]);
}

int max_towers(int L, int R, int D) {
	L++; R++;
	if (L == R) return 1;
	h[L - 1] = h[R + 1] = INF;
	for (int i = L - 1; i <= R + 1; i++)
		tt[0][i] = h[i];
	for (int k = 1; k < LOGN; k++)
	for (int i = L - 1; i + (1 << k) - 1 <= R + 1; i++)
		tt[k][i] = max(tt[k - 1][i], tt[k - 1][i + (1 << (k - 1))]);
	stack<int> st; st.push(L - 1);
	for (int i = L; i <= R + 1; i++) {
		while (h[st.top()] < h[i]) {
			r[st.top()] = i;
			st.pop();
		}
		l[i] = st.top();
		st.push(i);
	}
	for (int i = L - 1; i <= R + 1; i++)
		dp0[i] = dp1[i] = dp2[i] = -INF;
	for (int i = L; i <= R; i++) {
		dp0[i] = 1;
		int cl = L - 1, cr = i - 1;
		while (cl < cr) {
			int mid = (cl + cr) / 2 + 1;
			if (getmax(mid, i - 1) >= h[i] + D) cl = mid;
			else cr = mid - 1;
		}
		upd(dp0[i], dp2[cl] + 1);
		cl = i + 1, cr = R + 1;
		while (cl < cr) {
			int mid = (cl + cr) / 2;
			if (getmax(i + 1, mid) >= h[i] + D) cr = mid;
			else cl = mid + 1;
		}
		upd(dp1[cl], dp0[i]);
		upd(dp2[i], max(dp2[l[i]], dp1[i]));
		upd(dp1[r[i]], dp1[i]);
	}
	int ans = 0;
	for (int i = L; i <= R; i++)
		ans = max(ans, dp0[i]);
	return ans;
}





/*
int main() {
  int N, Q;
  assert(2 == scanf("%d %d", &N, &Q));
  std::vector<int> H(N);
  for (int i = 0; i < N; ++i) {
    assert(1 == scanf("%d", &H[i]));
  }
  init(N, H);

  for (int i = 0; i < Q; ++i) {
    int L, R, D;
    assert(3 == scanf("%d %d %d", &L, &R, &D));
    printf("%d\n", max_towers(L, R, D));
  }
  return 0;
}
//*/
#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...