Submission #238138

#TimeUsernameProblemLanguageResultExecution timeMemory
238138HellAngelJakarta Skyscrapers (APIO15_skyscraper)C++14
100 / 100
190 ms69600 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn = 50007;

int n, m, a[maxn], start[maxn], len[maxn], dist[maxn];
set<int> st[maxn];
vector<pair<int, int>> vt[maxn];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

bool Inside(int x)
{
    return (x >= 0 && x < n);
}

int32_t main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    if(fopen("test.inp", "r")) freopen("test.inp", "r", stdin), freopen("test.out", "w", stdout);
    cin >> n >> m;
    if(m == 1)
    {
        cout << -1;
        return 0;
    }
    fill_n(dist, n, 1e9);
    for(int i = 1; i <= m; i++)
    {
        cin >> start[i] >> len[i];
        st[start[i]].insert(len[i]);
    }
    for(int i = 0; i < n; i++)
    {
        for(auto j: st[i])
        {
            for(int cnt = 1;;cnt++)
            {
                int nxt = i - cnt * j;
                if(nxt < 0) break;
                vt[i].emplace_back(nxt, cnt);
                if(st[nxt].count(j)) break;
            }
            for(int cnt = 1;;cnt++)
            {
                int nxt = i + cnt * j;
                if(nxt >= n) break;
                vt[i].emplace_back(nxt, cnt);
                if(st[nxt].count(j)) break;
            }
        }
    }
    dist[start[1]] = 0;
    pq.emplace(0, start[1]);
    while(pq.size())
    {
        pair<int, int> p = pq.top();
        pq.pop();
        if(p.first != dist[p.second]) continue;
        int u = p.second;
        if(u == start[2])
        {
            cout << dist[u];
            exit(0);
        }
        for(auto i: vt[u])
        {
            int v = i.first;
            int w = i.second;
            if(dist[v] > dist[u] + w)
            {
                dist[v] = dist[u] + w;
                pq.emplace(dist[v], v);
            }
        }
    }
    cout << -1;
}

Compilation message (stderr)

skyscraper.cpp: In function 'int32_t main()':
skyscraper.cpp:20:63: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
     if(fopen("test.inp", "r")) freopen("test.inp", "r", stdin), freopen("test.out", "w", stdout);
                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
skyscraper.cpp:20:63: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
#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...