Submission #145050

#TimeUsernameProblemLanguageResultExecution timeMemory
145050faremyGlobal Warming (CEOI18_glo)C++14
100 / 100
503 ms9432 KiB
#include <iostream>
#include <algorithm>
#include <set>


struct Seq
{
	Seq(int v, int s) : maxVal(v), size(s) {}
	int maxVal, size;
	
	bool operator <(const Seq &other) const
	{
		return (maxVal < other.maxVal);
	}
};

const int MAXN = 2e5;

int temp[MAXN];
int lis[MAXN], lds[MAXN];

std::set<Seq> stacket;


void insert(Seq sequence)
{
	while (stacket.lower_bound(sequence) != stacket.end() && stacket.lower_bound(sequence)->size <= sequence.size)
		stacket.erase(stacket.lower_bound(sequence));
	std::set<Seq>::iterator prev = stacket.upper_bound(sequence);

	prev--;
	if (prev->size < sequence.size)
		stacket.emplace(sequence);
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cout.tie(nullptr);
	std::cin.tie(nullptr);

	int days, maxOffset;
	std::cin >> days >> maxOffset;

	for (int iDay = 0; iDay < days; iDay++)
		std::cin >> temp[iDay];

	stacket.emplace(0, 0);
	for (int iDay = 0; iDay < days; iDay++)
	{
		std::set<Seq>::iterator prev = stacket.lower_bound(Seq(temp[iDay], 1));
		prev--;
		lis[iDay] = prev->size + 1;
		insert(Seq(temp[iDay], lis[iDay]));
	}

	stacket.clear();

	stacket.emplace(-2e9, 0);
	for (int iDay = days - 1; iDay > -1; iDay--)
	{
		std::set<Seq>::iterator prev = stacket.lower_bound(Seq(-temp[iDay], 1));
		prev--;
		lds[iDay] = prev->size + 1;
		insert(Seq(-temp[iDay], lds[iDay]));
	}

	stacket.clear();
	int maxLength = 1;

	stacket.emplace(0, 0);
	for (int iDay = 0; iDay < days; iDay++)
	{
		std::set<Seq>::iterator prev = stacket.lower_bound(Seq(temp[iDay] + maxOffset, 1));
		prev--;
		maxLength = std::max(maxLength, prev->size + lds[iDay]);
		insert(Seq(temp[iDay], lis[iDay]));
	}

	std::cout << maxLength << '\n';

	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...