제출 #1130742

#제출 시각아이디문제언어결과실행 시간메모리
1130742Hamed_GhaffariJakarta Skyscrapers (APIO15_skyscraper)C++20
57 / 100
1102 ms165072 KiB
#include<bits/stdc++.h> using namespace std; #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,sse4,sse4.2,lzcnt,popcnt") #define X first #define Y second #define SZ(x) int(x.size()) #define pb push_back using ll = long long; using pii = pair<int, int>; const int INF = 1e9; vector<vector<pair<int, bool>>> g; int add_vertex() { g.pb({}); return SZ(g)-1; } void add_edge(int u, int v, bool w) { g[u].pb(pii(v, w)); } vector<int> BFS01(int s) { vector<int> dis(SZ(g), INF); dis[s] = 0; deque<int> pq; pq.push_back(s); while(SZ(pq)) { int v = pq.front(); pq.pop_front(); for(auto [u, w] : g[v]) if(dis[u]>dis[v]+w) { dis[u] = dis[v]+w; if(w) pq.push_back(u); else pq.push_front(u); } } return dis; } const int MXN = 3e4+4; int n, m, B[MXN], P[MXN]; set<pii> st[MXN], chk; int id(int i, int p) { auto it = st[i].lower_bound(pii(p, 0)); if(it != st[i].end() && it->X==p) return it->Y; int v = add_vertex(); st[i].insert(pii(p, v)); return v; } int32_t main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); cin >> n >> m; for(int i=0; i<n; i++) add_vertex(); for(int i=0; i<m; i++) { cin >> B[i] >> P[i]; int b = B[i]%P[i]; if(chk.find(pii(b,P[i]))==chk.end()) { for(int j=b; j<n; j+=P[i]) { add_edge(id(j, P[i]), j, 0); if(j+P[i]<n) add_edge(id(j, P[i]), id(j+P[i], P[i]), 1), add_edge(id(j+P[i], P[i]), id(j, P[i]), 1); } chk.insert(pii(b,P[i])); } add_edge(B[i], id(B[i], P[i]), 0); } int ans = BFS01(id(B[0], P[0]))[id(B[1],P[1])]; if(ans == INF) ans = -1; cout << ans << '\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...