제출 #836957

#제출 시각아이디문제언어결과실행 시간메모리
836957Abrar_Al_Samit송신탑 (IOI22_towers)C++17
17 / 100
782 ms5616 KiB
#include "towers.h"
#include <bits/stdc++.h>
 
using namespace std;
 
//subtask 2 & 3
 
const int nax = 100005;
int n;
bool l_maxima[nax];
int l[nax], r[nax];
int pmax[nax], nmax[nax];
bool is[nax];
vector<int>pl;
 
void init(int N, vector<int> H) {
 	n = N;
	int mn = H[0];
	for(int i=1; i<n-1; ++i) {
		if(H[i]>H[i-1] && H[i]>H[i+1]) {
			l_maxima[i] = 1;
			l[i] = H[i] - mn;
			mn = 2e9;
		} else {
			mn = min(mn, H[i]);
		}
	}


	int p = -1;
	for(int i=1; i<n; ++i) if(l_maxima[i]) {
		pmax[i] = p;
		p = i;
	}
	p = n;
	for(int i=n-1; i>0; --i) if(l_maxima[i]) {
		nmax[i] = p;
		p = i;
	}

	mn = H[n-1];
	for(int i=n-2; i>0; --i) {
		if(l_maxima[i]) {
			r[i] = H[i] - mn;
			mn = 2e9;
		} else {
			mn = min(mn, H[i]);
		}
	}


	set<pair<int,int>>s;
	for(int i=1; i<n; ++i) if(l_maxima[i]) {
		s.insert(make_pair(min(l[i], r[i]), i));
		is[i] = 1;
	}
	while(!s.empty()) {
		auto [x, i] = *s.begin();
		s.erase(s.begin());
		is[i] = 0;

		pl.push_back(min(l[i], r[i]));
 
		int lmin = H[i] - l[i], rmin = H[i] - r[i];
 
		if(pmax[i]!=-1 && is[pmax[i]]) {
			s.erase(make_pair(min(l[pmax[i]], r[pmax[i]]), pmax[i]));
			r[pmax[i]] = max(r[pmax[i]], H[pmax[i]] - rmin);
			s.insert(make_pair(min(l[pmax[i]], r[pmax[i]]), pmax[i]));

			nmax[pmax[i]] = nmax[i];
		}
		if(nmax[i]!=n && is[nmax[i]]) {
			s.erase(make_pair(min(l[nmax[i]], r[nmax[i]]), nmax[i]));
			l[nmax[i]] = max(l[nmax[i]], H[nmax[i]] - lmin);
			s.insert(make_pair(min(l[nmax[i]], r[nmax[i]]), nmax[i]));

			pmax[nmax[i]] = pmax[i];
		}
	} 
}
 
int max_towers(int L, int R, int D) {
	int ans =  pl.end() - lower_bound(pl.begin(), pl.end(), D);
	++ans;
	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...