제출 #666205

#제출 시각아이디문제언어결과실행 시간메모리
666205KahouJakarta Skyscrapers (APIO15_skyscraper)C++14
100 / 100
272 ms136836 KiB
#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define mk make_pair
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const ll inf = 1e18 + 50;
const int N = 30050, SQ = 210;
ll n, m, b[N], p[N], dis[N];
bool mark[SQ][N];
vector<pll> adj[N];
set<pll> st;

void solve() {
        cin >> n >> m;
        for (int x = 0; x < n; x++) {
                dis[x] = inf;
        }
        for (int i = 0; i < m; i++) {
                cin >> b[i] >> p[i];
                if (p[i] < SQ) mark[p[i]][b[i]] = 1;
                else for (int x = b[i]%p[i]; x < n; x += p[i]) {
                        adj[b[i]].push_back({x, abs(b[i]-x)/p[i]});
                }
        }
        for (int d = 1; d < SQ; d++) {
                for (int x = 0; x < n; x++) {
                        if (!mark[d][x]) continue;
                        for (int y = x + d; y < n; y += d) {
                                adj[x].push_back({y, abs(x-y)/d});
                                if (mark[d][y]) break;
                        }
                        for (int y = x - d; y >= 0; y -= d) {
                                adj[x].push_back({y, abs(x-y)/d});
                                if (mark[d][y]) break;
                        }
                }
        }

        dis[b[0]] = 0;
        st.insert({dis[b[0]], b[0]});

        while (st.size()) {
                ll u = st.begin()->S;
                st.erase(st.begin());;
                for (pll x: adj[u]) {
                        ll v = x.F, w = x.S;
                        if (dis[u] + w < dis[v]) {
                                st.erase({dis[v], v});
                                dis[v] = dis[u] + w;
                                st.insert({dis[v], v});
                        }
                }
        }

        cout << (dis[b[1]] >= inf? -1: dis[b[1]]) << endl;
}
int main() {
        ios::sync_with_stdio(0), cin.tie(0);
        solve();
        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...