제출 #657334

#제출 시각아이디문제언어결과실행 시간메모리
657334Ronin13Jakarta Skyscrapers (APIO15_skyscraper)C++14
100 / 100
697 ms56496 KiB
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define f first
#define s second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pb push_back
#define epb emplace_back
using namespace std;

const int NMAX = 30001;
bool used[NMAX][151];
bool use1[NMAX][151];
vector <vector <int> > vv(NMAX);
vector <pii> g[NMAX];
int d[NMAX][151];

int main(){
    int n; cin >> n;
    int m; cin >> m;
    int b[m + 1], p[m + 1];
    for(int i = 0; i < m; i++){
        cin >> b[i] >> p[i];
        if(p[i] > 150){
            int x = b[i] - p[i];
            int cnt = 1;
            while(x >= 0){
                g[b[i]].pb({x, cnt++});
                x -= p[i];
            }
            x = b[i] + p[i];
            cnt = 1;
            while(x < n){
                g[b[i]].pb({x, cnt++});
                x += p[i];
            }
            continue;
        }
        if(!use1[b[i]][p[i]])
            use1[b[i]][p[i]] = true, vv[b[i]].pb(p[i]);
    }
    for(int i = 0; i < n; i++){
        for(int j = 0; j <= 150; j++)
            d[i][j] = 1e9;
    }
    d[b[0]][0] = 0;
    priority_queue<pair<int, pii> > q;
    q.push({0, {b[0], 0}});
    while(!q.empty()){
        int x = q.top().s.s, v = q.top().s.f;
        q.pop();
        if(used[v][x]) continue;
        used[v][x] = true;
        if(x == 0){
            for(int to : vv[v]){
                if(d[v][to] > d[v][x])
                    d[v][to] = d[v][x], q.push({-d[v][to], {v, to}});
            }
            for(auto to : g[v]){
                if(d[to.f][0] > d[v][x] + to.s)
                    d[to.f][0] = d[v][x] + to.s, q.push({-d[to.f][0], {to.f,0}});
            }
        }
        else{
            if(d[v][0] > d[v][x])
                d[v][0] = d[v][x], q.push({-d[v][0], {v, 0}});
            if(v >= x && d[v - x][x] > d[v][x] + 1)
                d[v - x][x] = d[v][x] + 1, q.push({-d[v - x][x], {v - x, x}});
            if(v + x < n && d[v + x][x] > d[v][x] + 1)
                d[v + x][x] = d[v][x] + 1, q.push({-d[v + x][x], {v + x, x}});
        }
    }
    if(d[b[1]][0] == 1e9)
        d[b[1]][0] = -1;
    cout << d[b[1]][0];
    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...