Submission #739860

#TimeUsernameProblemLanguageResultExecution timeMemory
739860blueSparklers (JOI17_sparklers)C++17
100 / 100
48 ms2944 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using vll = vector<ll>;
using vi = vector<int>;
using vvll = vector<vll>;
using vvi = vector<vi>;

#define sz(x) int(x.size())

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	ll N, K, T;
	cin >> N >> K >> T;

	vll X(1+N);
	for(int i = 1; i <= N; i++)
	{
		cin >> X[i];
	}



	ll lo = 0, hi = ((((1'000'000'000'000'000'000LL / 2LL + 1) / N) + 1) / T) + 1; 

	// ll lo = 1, hi = 1'000'000'000'000'000'000LL/N;

	// ll lo = 0, hi = 5;
// 

	while(lo != hi)
	{
		// cerr << "\n\n\n\n\n searching " << lo << ' ' << hi << '\n';
		ll mid = (lo + hi)/2;

		// cerr << "mid = " << mid << "\n";

		vll Y(1+N);
		for(ll i = 1; i <= N; i++)
		{
			Y[i] = 2LL * T * mid * i - X[i];
		}

		if(Y[1] > Y[N])
		{
			lo = mid + 1;
			continue;
		}



		int il = K, ir = K;

		// for(int i = 1; i <= N; i++)
		// 	cerr << Y[i] << ' ';
		// cerr << '\n';

		for(int t = 0; 1; t++)
		{
			if(t % 2 == 0)
			{
				int ln = il;

				for(int i = il-1; i >= 1; i--)
				{
					if(Y[i] <= Y[ln])
						ln = i;
					if(Y[i] > Y[ir])
						break;
				}

				if(ln == il && t >= 2)
					break;
				else
					il = ln;
			}
			else
			{
				int rn = ir;

				for(int i = ir+1; i <= N; i++)
				{
					if(Y[i] >= Y[rn])
						rn = i;
					if(Y[i] < Y[il])
						break;
				}

				if(rn == ir && t >= 2)
					break;
				else
					ir = rn;
			}
		}



		int ul = 1, ur = N;

		for(int t = 0; 1; t++)
		{
			if(t % 2 == 0)
			{
				int ln = ul;

				for(int i = ul+1; i <= K; i++)
				{
					if(Y[i] <= Y[ln])
						ln = i;
					if(Y[i] > Y[ur])
						break;
				}

				if(ln == ul && t >= 2)
					break;
				else
					ul = ln;
			}
			else
			{
				int rn = ur;

				for(int i = ur-1; i >= K; i--)
				{
					if(Y[i] >= Y[rn])
						rn = i;
					if(Y[i] < Y[ul])
						break;
				}

				if(rn == ur && t >= 2)
					break;
				else
					ur = rn;
			}
		}

		if(il <= ul && ur <= ir)
			hi = mid;
		else
			lo = mid+1;
	}

	cout << hi << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...