제출 #14384

#제출 시각아이디문제언어결과실행 시간메모리
14384tncks0121Jakarta Skyscrapers (APIO15_skyscraper)C++14
57 / 100
71 ms2836 KiB
#include <bits/stdc++.h> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <time.h> #include <limits.h> using namespace std; typedef long long ll; typedef double lf; const int N_ = 30050; const int M_ = 30050; vector<int> jumps[N_]; int N, M; int target, ans; int start; int dst[N_]; bool vis[N_]; void solve1() { for(int i = 0; i < N; i++) dst[i] = (int)1e9; dst[start] = 0; for(int rep = 0; rep < N; rep++) { int u = -1, d = (int)1e9; for(int i = 0; i < N; i++) { if(dst[i] < d && !vis[i]) u = i, d = dst[i]; } if(u == -1) { ans = -1; return; } if(u == target) { ans = d; return; } vis[u] = true; for(int e = 0; e < jumps[u].size(); e++) { int p = jumps[u][e]; for(int i = u + p, j = 1; i < N; i += p, j++) { if(!vis[i] && dst[i] > dst[u] + j) dst[i] = dst[u] + j; } for(int i = u - p, j = 1; i >= 0; i -= p, j++) { if(!vis[i] && dst[i] > dst[u] + j) dst[i] = dst[u] + j; } } } } void solve2() { } int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); scanf("%d%d", &N, &M); for(int i = 0; i < M; i++) { int b, p; scanf("%d%d", &b, &p); if(i == 0) start = b; if(i == 1) target = b; if(p < N) jumps[b].push_back(p); } if(N <= 2000) { solve1(); }else{ solve2(); } printf("%d\n", ans); 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...