Submission #1182427

#TimeUsernameProblemLanguageResultExecution timeMemory
1182427boclobanchatJakarta Skyscrapers (APIO15_skyscraper)C++20
100 / 100
46 ms10176 KiB
#include<bits/stdc++.h>
using namespace std;
#define ii pair<int,int>
#define fi first
#define se second
const int MAXN=3e4+5;
const int sqr=222;
int dp[MAXN];
bool ck[MAXN][sqr+5];
vector<int> vi[MAXN];
priority_queue< ii,vector<ii>,greater<ii> > pq;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,m,st=0,ed=0;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int b,p;
		cin>>b>>p;
		if(i==1) st=b;
		if(i==2) ed=b;
		vi[b].push_back(p);
	}
	for(int i=0;i<n;i++) dp[i]=1e9;
	pq.push({dp[st]=0,st});
	while(!pq.empty())
	{
		int a=pq.top().fi,b=pq.top().se;
		pq.pop();
		if(dp[b]<a) continue;
		for(auto v:vi[b])
		{
			if(v<=sqr) ck[b][v]=true;
			int pos=b,cnt=0;
			while(pos+v<n)
			{
				pos+=v,cnt++;
				if(v<=sqr&&ck[pos][v]) break;
				if(dp[pos]>a+cnt) pq.push({dp[pos]=a+cnt,pos});
				if(v<=sqr) ck[pos][v]=true;
			}
			pos=b,cnt=0;
			while(pos-v>=0)
			{
				pos-=v,cnt++;
				if(v<=sqr&&ck[pos][v]) break;
				if(dp[pos]>a+cnt) pq.push({dp[pos]=a+cnt,pos});
				if(v<=sqr) ck[pos][v]=true;
			}
		}
	}
	if(dp[ed]==1e9) cout<<-1;
	else cout<<dp[ed];
}
#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...