Submission #387968

#TimeUsernameProblemLanguageResultExecution timeMemory
387968cpp219Jakarta Skyscrapers (APIO15_skyscraper)C++14
100 / 100
138 ms14364 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define fi first
#define se second
 
typedef long long ll;
typedef pair<ll,int> ii;
 
const int N = 3e4;
const ll INF = 1e18;
int n, m;
int b[N+2], p[N+2];
ll dis[N+2];
vector<int> adj[N+2];
unordered_map<int,bool> lf[N+2], rg[N+2];
 
int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        cin >> b[i] >> p[i];
        adj[b[i]].push_back(p[i]);
    }
    for (int i = 0; i < n; i++) {
        sort(adj[i].begin(),adj[i].end());
        adj[i].resize(unique(adj[i].begin(),adj[i].end())-adj[i].begin());
    }
    for (int i = 0; i < n; i++) dis[i] = INF;
    priority_queue<ii,vector<ii>,greater<ii>> pq;
    pq.push({0,b[0]}); dis[b[0]] = 0;
    while (!pq.empty()) {
        ii cur = pq.top(); pq.pop();
        ll dist = cur.fi, node = cur.se;
        if (node == b[1]) {
            cout << dist << '\n';
            return 0;
        }
        if (dis[node] != dist) continue;
        for (int i : adj[node]) {
            if (!lf[node][i]) {
                for (int j = node-i, k = 1; j >= 0; j -= i, k++) {
                    ll nxDist = dist+k, nxNode = j;
                    if (dis[nxNode] > nxDist) {
                        dis[nxNode] = nxDist;
                        pq.push({nxDist,nxNode});
                    }
                    int p = lower_bound(adj[nxNode].begin(),adj[nxNode].end(),i)-adj[nxNode].begin();
                    if (p < adj[nxNode].size() && adj[nxNode][p] == i) {
                        lf[nxNode][i] = 1;
                        rg[nxNode][i] = 1;
                    }
                }
            }
            if (!rg[node][i]) {
                for (int j = node+i, k = 1; j < n; j += i, k++) {
                    ll nxDist = dist+k, nxNode = j;
                    if (dis[nxNode] > nxDist) {
                        dis[nxNode] = nxDist;
                        pq.push({nxDist,nxNode});
                    }
                    int p = lower_bound(adj[nxNode].begin(),adj[nxNode].end(),i)-adj[nxNode].begin();
                    if (p < adj[nxNode].size() && adj[nxNode][p] == i) {
                        lf[nxNode][i] = 1;
                        rg[nxNode][i] = 1;
                    }
                }
            }
        }
    }
    cout << "-1\n";
    return 0;
}

Compilation message (stderr)

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:49:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |                     if (p < adj[nxNode].size() && adj[nxNode][p] == i) {
      |                         ~~^~~~~~~~~~~~~~~~~~~~
skyscraper.cpp:63:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |                     if (p < adj[nxNode].size() && adj[nxNode][p] == i) {
      |                         ~~^~~~~~~~~~~~~~~~~~~~
#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...