Submission #1360236

#TimeUsernameProblemLanguageResultExecution timeMemory
1360236MuhammadSaramRainforest Jumps (APIO21_jumps)C++17
4 / 100
189 ms2008 KiB
#include <bits/stdc++.h>

using namespace std;

#define endl '\n'

const int M = 2001, lg = 11;

int dis[M][M][lg], n;
vector<int> nei[M];

void bfs(int u)
{
	for (int i=0;i<n;i++) dis[u][i][0]=M;
	dis[u][u][0]=0;
	queue<int> q;
	q.push(u);
	while (!q.empty())
	{
		int x=q.front();q.pop();
		for (int i:nei[x])
			if (dis[u][i][0]>dis[u][x][0]+1)
			{
				dis[u][i][0]=dis[u][x][0]+1;
				q.push(i);
			}
	}
}

void init(int N, vector<int> a)
{
	n=N;
	if (n<=2000)
	{
		for (int i=0;i<n;i++)
		{
			for (int j=i-1;j>=0;j--)
				if (a[j]>a[i])
				{
					nei[i].push_back(j);
					break;
				}
			for (int j=i+1;j<n;j++)
				if (a[j]>a[i])
				{
					nei[i].push_back(j);
					break;
				}
		}
		for (int i=0;i<n;i++)
		{
			bfs(i);
			for (int j=0;j<n;j++)
				for (int p=1;j+(1<<p)<=n;p++)
					dis[i][j][p]=min(dis[i][j][p-1],dis[i][j+(1<<p-1)][p-1]);
		}
	}
}

int get(int a,int l,int r)
{
	int b=31-__builtin_clz(r-l);
	return min(dis[a][l][b],dis[a][r-(1<<b)][b]);
}

int minimum_jumps(int a,int b,int c,int d)
{
	if (n<=2000)
	{
		int ans=M;
		for (int i=a;i<=b;i++)
			ans=min(ans,get(i,c,d+1));
		if (ans==M) ans=-1;
		return ans;
	}
	return c-b;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...