Submission #754220

#TimeUsernameProblemLanguageResultExecution timeMemory
754220blue송신탑 (IOI22_towers)C++17
17 / 100
1025 ms13760 KiB
#include "towers.h"
#include <bits/stdc++.h>
using namespace std;
 
using vi = vector<int>;
using vvi = vector<vi>;
using ll = long long;
using vll = vector<ll>;
 
int N;
vi H;
 
vi LS, RS;
 
vll dist, dist2;
 
 
 
 
 
 
 
struct segtree
{
	int l;
	int r;
 
	int mx = 0;
 
 
	segtree* left = NULL;
	segtree* right = NULL;
 
	segtree()
	{
		;
	}
 
	segtree(int L, int R)
	{
		l = L;
		r = R;
 
		if(l == r)
			mx = H[l];
		else
		{
			int m = (l + r)/2;
			left = new segtree(l, m);
			right = new segtree(m+1, r);
 
			mx = max(left->mx, right->mx);
		}
	}
 
	int rangemax(int L, int R)
	{
		if(R < l || r < L)
			return -1;
		else if(L <= l && r <= R)
			return mx;
		else
			return max(left->rangemax(L, R), right->rangemax(L, R));
	}
};
 
 
 
 
 
 
 
 
 
void init(int N_, vi H_)
{
	N = N_;
	H = H_;
 
	LS = RS = vi(N, -1);
 
	vi st;
	st.push_back(-1);
 
	for(int i = 0; i < N; i++)
	{
		while(st.back() != -1 && H[i] < H[st.back()])
			st.pop_back();
 
		LS[i] = st.back();
 
		st.push_back(i);
	}
    // cerr << "A\n";
 
 
	segtree ST(0, N-1);

    // cerr << "B\n";
 
 
	st.clear();
 
	st.push_back(N);
	for(int i = N-1; i >= 0; i--)
	{
		while(st.back() != N && H[i] < H[st.back()])
			st.pop_back();
 
		RS[i] = st.back();
 
		st.push_back(i);
	}

    // cerr << "C\n";
 
	for(int i = 0; i < N; i++)
	{
		dist.push_back(0);
 
		ll lval = 1'000'000'001LL;
 
		if(LS[i] != -1)
			lval = ST.rangemax(LS[i]+1, i-1) - H[i];
 
 
 
		ll rval = 1'000'000'001LL;
 
		if(RS[i] != N)
			rval = ST.rangemax(i+1, RS[i]-1) - H[i];
 
 
		dist[i] = min(lval, rval);
 
		// cerr << i << " : " << LS[i] << ' ' << RS[i] << ' ' << lval << ' ' << rval << '\n';
	}
 
	dist2 = dist;
 
	sort(dist2.begin(), dist2.end());

    // cerr << "D\n";
}
 
int max_towers(int L, int R, int D)
{
    // cerr << "enter\n";
	int lo = 0, hi = N;
	while(lo != hi)
	{
		int mid = (lo + hi)/2;
 
		if(dist2[mid] < D)
			lo = mid+1;
		else
			hi = mid;
	}

    // cerr << "exit\n";
 
	return N - lo;
}
#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...