Submission #438641

# Submission time Handle Problem Language Result Execution time Memory
438641 2021-06-28T10:54:23 Z AriaH Rainforest Jumps (APIO21_jumps) C++11
0 / 100
53 ms 40588 KB
#include "jumps.h"
/** vaziat sorati ghermeze **/

#pragma GCC optimize("O2")
#include <bits/stdc++.h>
using namespace std;

typedef long long                   ll;
typedef long double                 ld;
typedef pair<int,int>               pii;
typedef pair<ll,ll>                 pll;
#define all(x)                      (x).begin(),(x).end()
#define F                           first
#define S                           second
#define Mp                          make_pair
#define SZ(x)			    		(int)x.size()
#define fast_io                     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io                     freopen("in.txt" , "r+" , stdin) ; freopen("out.txt" , "w+" , stdout);

const int N = 1e6 + 10;
const ll mod = 1e9 + 7;
const ll mod2 = 998244353;
const ll inf = 8e18;
const int LOG = 20;

ll pw(ll a , ll b, ll M)  { return (!b ? 1 : (b & 1 ? (a * pw(a * a % M, b / 2, M)) % M : pw(a * a % M, b / 2, M))); }

int h[N], L[LOG][N], R[LOG][N], best[LOG][N];

void init(int n, vector < int > H)
{
	for(int i = 0; i < n; i ++) { h[i + 1] = H[i]; }
	h[0] = h[n + 1] = 2e9;
	deque < int > dq;
	n += 2;
	for(int i = 0; i < n; i ++)
	{
		while(SZ(dq) && h[dq.back()] <= h[i]) dq.pop_back();
		L[0][i] = (dq.empty()? i : dq.back());
		dq.push_back(i);
	}
	dq.clear();
	for(int i = n; i >= 0; i --)
	{
		while(SZ(dq) && h[dq.back()] <= h[i]) dq.pop_back();
		R[0][i] = (dq.empty()? i : dq.back());
		dq.push_back(i);
	}
	for(int i = 1; i <= n; i ++)
	{
		best[0][i] = (h[L[0][i]] > h[R[0][i]]? L[0][i] : R[0][i]);
	}
	for(int T = 1; T < LOG; T ++)
	{
		for(int i = 1; i <= n; i ++)
		{
			L[T][i] = L[T - 1][L[T - 1][i]];
			R[T][i] = R[T - 1][R[T - 1][i]];
			best[T][i] = best[T - 1][best[T - 1][i]];
		}
	}
}

inline int get(int l, int r)
{
	for(int T = LOG - 1; ~T; T --) { if(R[T][l] <= r) l = R[T][l]; }
	return l;
}

int minimum_jumps(int A, int B, int C, int D)
{
	A ++, B ++, C ++, D ++;
	if(B + 1 == C)
	{
		return (R[0][B] > D? -1 : 1);
	}
	int mid = get(B + 1, C - 1);
	///printf("mid = %d\n", mid);
	if(h[B] > h[mid])
	{
		return (R[0][B] > D? -1 : 1);
	}
	for(int T = LOG - 1; ~T; T --)
	{
		if(L[T][B] >= A && h[L[T][B]] < h[mid]) B = L[T][B];
	}
	///printf("B = %d\n", B);
	int tot = 0;
	if(A <= L[0][B])
	{
		if(R[0][L[0][B]] <= D) return 1;
	}
	else
	{
		for(int T = LOG - 1; ~T; T --)
		{
			///printf("T = %d B = %d best = %d\n", T, B, best[T][B]);
			if(h[best[T][B]] <= h[mid])
			{
				tot += 1 << T;
				B = best[T][B];
			}
		}
		if(B == mid)
		{
			return (R[0][B] <= D? ++tot : -1);
		}
		if(L[0][B] && R[0][L[0][B]] <= D)
		{
			return tot + 2;
		}
	}
	printf("tot = %d\n", tot);
	for(int T = LOG - 1; ~T; T --)
	{
		if(R[T][B] < C)
		{
			tot += 1 << T;
			B = R[T][B];
		}
	}
	if(C <= R[0][B] && R[0][B] <= D) return tot + 1;
	return -1;
}

/** test corner cases(n = 1?) watch for overflow or minus indices **/
# Verdict Execution time Memory Grader output
1 Correct 1 ms 712 KB Output is correct
2 Correct 1 ms 712 KB Output is correct
3 Incorrect 48 ms 40588 KB Security Violation
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 712 KB Output is correct
2 Correct 1 ms 712 KB Output is correct
3 Correct 1 ms 712 KB Output is correct
4 Correct 1 ms 712 KB Output is correct
5 Incorrect 1 ms 712 KB Security Violation
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 712 KB Output is correct
2 Correct 1 ms 712 KB Output is correct
3 Correct 1 ms 712 KB Output is correct
4 Correct 1 ms 712 KB Output is correct
5 Incorrect 1 ms 712 KB Security Violation
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 712 KB Output is correct
2 Correct 1 ms 712 KB Output is correct
3 Correct 1 ms 712 KB Output is correct
4 Correct 1 ms 712 KB Output is correct
5 Incorrect 53 ms 40352 KB Security Violation
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 712 KB Output is correct
2 Correct 1 ms 712 KB Output is correct
3 Correct 1 ms 712 KB Output is correct
4 Incorrect 28 ms 23204 KB Security Violation
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 712 KB Output is correct
2 Correct 1 ms 712 KB Output is correct
3 Correct 1 ms 712 KB Output is correct
4 Incorrect 28 ms 23204 KB Security Violation
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 712 KB Output is correct
2 Correct 1 ms 712 KB Output is correct
3 Incorrect 48 ms 40588 KB Security Violation
4 Halted 0 ms 0 KB -