Submission #204628

#TimeUsernameProblemLanguageResultExecution timeMemory
204628cgiosyJakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
277 ms5612 KiB
#include <bits/stdc++.h>
using namespace std;
 
struct pii {
	int x, i;
	bool operator<(const pii b) const { return x>b.x; }
};
int main() {
	ios_base::sync_with_stdio(false);cin.tie(nullptr);
	int N, M, st=0, ed=-1;
	cin>>N>>M;
	vector<int> D(N, INT_MAX);
	vector<vector<int>> A(N);
	for(int i=0; i<M; i++) {
		int x, m;
		cin>>x>>m;
		if(i==0) st=x;
		else if(i==1) ed=x;
		if(max(x, N-1-x)>=m) A[x].push_back(m);
	}
	for(int i=0; i<N; i++) {
		sort(begin(A[i]), end(A[i]));
		A[i].erase(unique(begin(A[i]), end(A[i])), end(A[i]));
	}
 
	priority_queue<pii> q;
	q.push({0, st}); D[st]=0;
	while(q.size()) {
		auto[n,x]=q.top(); q.pop();
		if(D[x]!=n) continue;
		if(x==ed) { cout<<n; return 0; }
		for(int m:A[x]) {
			for(int i=x+m, d=n+1; i<N; i+=m, d++) if(d<D[i]) {
				D[i]=d, q.push({d, i});
				if(binary_search(begin(A[i]), end(A[i]), m)) break;
			}
			for(int i=x-m, d=n+1; i>=0; i-=m, d++) if(d<D[i]) {
				D[i]=d, q.push({d, i});
				if(binary_search(begin(A[i]), end(A[i]), m)) break;
			}
		}
	}
	cout<<-1;
}
#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...