Submission #1353175

#TimeUsernameProblemLanguageResultExecution timeMemory
1353175SkymagicJakarta Skyscrapers (APIO15_skyscraper)C++17
57 / 100
384 ms327680 KiB
#pragma GCC optimize("Ofast")
#include <iostream>
#include <queue>
#define int short
#define tiii pair<short, pair<short, short>>
using namespace std;

short MXN = 30000;
short n, m, dis[30001][3], b, p, d=2, st, en, cnt, cd, cb, cp, nd, nb, np;;
vector<tiii> g[30001][3];
short one=1;
priority_queue<tiii, vector<tiii>, greater<tiii>> pq;

signed main() {
    cin >> n >> m;
    for(int i=0; i<30001; i++) {
        fill(dis[i], dis[i] + 3, 32700);
    }
    for(int i=0; i<m; i++) {
        cin >> b >> p;
        if(i == 0) st = b;
        if(i == 1) en = b;
        if(p>=d) {
            cnt = 0;
            for(int j=b; j<n; j+=p) {
                g[b][d].push_back({j, {0, cnt}});
                cnt++;
            }
            cnt = 1;
            for(int j=b-p; j>=0; j-=p) {
                g[b][d].push_back({j, {0, cnt}});
                cnt++;
            }
            g[b][0].push_back({b, {d, 0}});
        } else {
            g[b][0].push_back({b, {p, 0}});
        }
    }
    pq.push({0, {st, 0}});
    while(!pq.empty()) {
        cd = pq.top().first;
        cb = pq.top().second.first;
        cp = pq.top().second.second;
        pq.pop();
        if(cd > dis[cb][cp]) continue;
        for(auto i: g[cb][cp]) {
            nd = cd+i.second.second;
            nb = i.first;
            np = i.second.first;
            if(nd < dis[nb][np]) {
                dis[nb][np] = nd;
                pq.push({nd, {nb, np}});
            }
        }
        if(cp != 0 && cp != d && cb-cp >= 0) {
            if(cd+1 < dis[cb-cp][cp]) {
                dis[cb-cp][cp] = cd+1;
                pq.push({cd+one, {cb-cp, cp}});
            }
        }
        if(cp != 0 && cp != d && cb+cp < n) {
            if(cd+1 < dis[cb+cp][cp]) {
                dis[cb+cp][cp] = cd+1;
                pq.push({cd+one, {cb+cp, cp}});
            }
        }
        if(cp != 0 && cd < dis[cb][0]) {
            dis[cb][0] = cd;
            pq.push({cd, {cb, 0}});
        }
    }
    if(dis[en][0] == 32700) cout << -1;
    else cout << dis[en][0];
    return 0;
}

Compilation message (stderr)

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:58:28: warning: narrowing conversion of '(((int)cd) + ((int)one))' from 'int' to 'short int' [-Wnarrowing]
   58 |                 pq.push({cd+one, {cb-cp, cp}});
      |                          ~~^~~~
skyscraper.cpp:64:28: warning: narrowing conversion of '(((int)cd) + ((int)one))' from 'int' to 'short int' [-Wnarrowing]
   64 |                 pq.push({cd+one, {cb+cp, cp}});
      |                          ~~^~~~
#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...