제출 #15876

#제출 시각아이디문제언어결과실행 시간메모리
15876myungwooJakarta Skyscrapers (APIO15_skyscraper)C++14
57 / 100
1000 ms33440 KiB
#include <bits/stdc++.h>
using namespace std;

#define MAXN 30005
#define pb push_back
#define mp make_pair
typedef pair<int, int> pii;

int N, M, S, E;
int D[MAXN][200];
bool V[MAXN][200];
vector <int> doge[MAXN];

int main()
{
	scanf("%d%d", &N, &M);
	for (int i=0;i<M;i++){
		int b, p;
		scanf("%d%d", &b, &p); doge[b].pb(p);
		V[b][p] = 1;
		if (!i) S = b;
		if (i == 1) E = b;
	}
	for (int i=0;i<N;i++) for (int j=0;j<200;j++) D[i][j] = 2e9;
	priority_queue <pii> que;
	D[S][0] = 0;
	que.push(mp(0, S*200));
	while (!que.empty()){
		int q = que.top().second, d = -que.top().first; que.pop();
		int jmp = q%200; q /= 200;
		if (D[q][jmp] != d) continue;
		if (jmp){
			if (D[q][0] > d)
				D[q][0] = d, que.push(mp(-D[q][0], q*200));
			if (q >= jmp && D[q-jmp][jmp] > d+1)
				D[q-jmp][jmp] = d+1, que.push(mp(-d-1, (q-jmp)*200+jmp));
			if (q+jmp < N && D[q+jmp][jmp] > d+1)
				D[q+jmp][jmp] = d+1, que.push(mp(-d-1, (q+jmp)*200+jmp));
			continue;
		}
		for (int p: doge[q]){
			if (p > 199){
				for (int i=q-p;i>=0;i-=p)
					if (D[i][0] > d+(q-i)/p)
						D[i][0] = d+(q-i)/p, que.push(mp(-D[i][0], i*200));
				for (int i=q+p;i<N;i+=p)
					if (D[i][0] > d+(i-q)/p)
						D[i][0] = d+(i-q)/p, que.push(mp(-D[i][0], i*200));
			}else{
				if (D[q][p] > d)
					D[q][p] = d, que.push(mp(-d, q*200+p));
			}
		}
	}
	printf("%d\n", D[E][0] < 2e9 ? D[E][0] : -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...