제출 #1321785

#제출 시각아이디문제언어결과실행 시간메모리
1321785NValchanovJakarta Skyscrapers (APIO15_skyscraper)C++20
100 / 100
613 ms3500 KiB
#include<bits/stdc++.h>
using namespace std;
void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}

typedef long long llong;

const int MAXN = 3e4 + 10;
const int INF = 1e9 + 10;

struct Edge
{
    int to, cost;

    Edge(){};

    Edge(int to, int cost)
    {
        this->to = to;
        this->cost = cost;
    }

    friend bool operator<(const Edge &e1, const Edge &e2)
    {
        return e1.cost > e2.cost;
    }
};

int n, m;
int start, finish;
int p[MAXN];
int power[MAXN];
int dist[MAXN];
vector < int > poss[MAXN];

void read()
{
    cin >> n >> m;

    for(int i = 1; i <= m; i++)
    {
        cin >> p[i] >> power[i];

        p[i]++;
    }

    start = p[1];
    finish = p[2];

    for(int i = 1; i <= m; i++)
    {
        poss[p[i]].push_back(power[i]);
    }
}

void solve()
{
    for(int i = 1; i <= n; i++)
    {
        dist[i] = INF;
    }

    priority_queue < Edge > pq;

    dist[start] = 0;

    pq.push(Edge(start, 0));

    while(!pq.empty())
    {
        Edge t = pq.top();
        pq.pop();

        int u = t.to;

        if(t.cost > dist[u])
            continue;

        for(int len : poss[u])
        {
            for(int jumps = 1; u + len * jumps <= n; jumps++)
            {
                int v = u + len * jumps;

                if(dist[u] + jumps < dist[v])
                {
                    dist[v] = dist[u] + jumps;

                    pq.push(Edge(v, dist[v]));
                }
            }

            for(int jumps = 1; u - len * jumps >= 1; jumps++)
            {
                int v = u - len * jumps;

                if(dist[u] + jumps < dist[v])
                {
                    dist[v] = dist[u] + jumps;

                    pq.push(Edge(v, dist[v]));
                }
            }
        }
    }

    if(dist[finish] == INF)
    {
        cout << -1 << endl;
    }
    else
    {
        cout << dist[finish] << endl;
    }
}

int main()
{
    speed();
    read();
    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...