Submission #1179185

#TimeUsernameProblemLanguageResultExecution timeMemory
1179185alexander707070Jakarta Skyscrapers (APIO15_skyscraper)C++20
100 / 100
148 ms71476 KiB
#include<bits/stdc++.h>
#define MAXN 30007
using namespace std;

struct doge{
	int pos,jump;

	inline friend bool operator < (doge fr,doge sc){
		if(fr.jump!=sc.jump)return fr.jump<sc.jump;
		if(fr.pos%fr.jump!=sc.pos%sc.jump)return fr.pos%fr.jump<sc.pos%sc.jump;
		return fr.pos<sc.pos;
	}
}d[MAXN];

int n,m,dist[MAXN];
vector<doge> w;

vector< pair<int,int> > v[MAXN];
priority_queue < pair<int,int> , vector< pair<int,int> > , greater< pair<int,int> > > q;
bool vis[MAXN];

void add_edge(int x,int y,int z){
	v[x].push_back({y,z});
}

void dijkstra(int x){
	for(int i=0;i<n;i++)dist[i]=n*n;

	dist[x]=0;
	q.push({0,x});

	while(!q.empty()){
		int minv=q.top().second;
		q.pop();

		if(vis[minv])continue;
		vis[minv]=true;

		for(auto nxt:v[minv]){
			if(vis[nxt.first] or dist[nxt.first]<=dist[minv]+nxt.second)continue;

			dist[nxt.first]=dist[minv]+nxt.second;
			q.push({dist[nxt.first],nxt.first});
		}
	}
}

int main(){

	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin>>n>>m;

	for(int i=1;i<=m;i++){
		cin>>d[i].pos>>d[i].jump;
	}

	int st=d[1].pos;
	int et=d[2].pos;

	sort(d+1,d+m+1);

	for(int i=1;i<=m;i++){
		if(i<m and d[i].jump==d[i+1].jump and d[i].pos%d[i].jump==d[i+1].pos%d[i+1].jump){
			w.push_back(d[i]);
			continue;
		}

		w.push_back(d[i]);
		for(int i=0;i<w.size();i++){
			for(int t=1;(i==0 or w[i].pos-t*w[i].jump>=w[i-1].pos) and w[i].pos-t*w[i].jump>=0;t++){
				add_edge(w[i].pos,w[i].pos-t*w[i].jump,t);
			}

			for(int t=1;(i==w.size()-1 or w[i].pos+t*w[i].jump<=w[i+1].pos) and w[i].pos+t*w[i].jump<n;t++){
				add_edge(w[i].pos,w[i].pos+t*w[i].jump,t);
			}
		}

		w.clear();
	}

	dijkstra(st);

	if(!vis[et]){
		cout<<"-1\n";
	}else{
		cout<<dist[et]<<"\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...