제출 #995816

#제출 시각아이디문제언어결과실행 시간메모리
995816ian0704Jakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
519 ms3532 KiB
#include <bits/stdc++.h>
using namespace std;
#define fastio ios_base :: sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
#define inf 1e9
int n,m;
int st,en;
int d[30010];
vector<int> v[30010];
void go()
{
    fill(d,d+n+1,inf);
    d[st]=0;
    priority_queue<pair<int,int>> pq;
    pq.push({0,st});
    while(!pq.empty())
    {
        pair<int,int> a=pq.top();
        int current=a.second;
        int distance=-a.first;
        //cout<<"| "<<current<<" "<<distance<<'\n';
        pq.pop();
        if(d[current]<distance) continue;
        for(auto j:v[current])
        {
            int num=1;
            while(1)
            {
                int temp=current+j*num;
                //cout<<d[current];
                if(temp>=n) break;
                if(distance+num<d[temp])
                {
                    d[temp]=distance+num;
                    pq.push({-d[temp],temp});
                    if(v[temp].size())
                    {
                        int idx=upper_bound(v[temp].begin(),v[temp].end(),j)-v[temp].begin();
                        if(v[temp][idx-1]==j) break;                        
                    }
                }
                num++;
            }
            num=1;
            while(1)
            {
                int temp=current-j*num;
                if(temp<0) break;
                if(distance+num<d[temp])
                {
                    d[temp]=distance+num;
                    pq.push({-d[temp],temp});
                    if(v[temp].size())
                    {
                        int idx=upper_bound(v[temp].begin(),v[temp].end(),j)-v[temp].begin();
                        if(v[temp][idx-1]==j) break;
                    }
                }
                num++;
            }
        }
    }
}
int main()
{
    fastio;
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int a,b;
        cin>>a>>b;
        if(i==0) st=a;
        else if(i==1) en=a;
        v[a].push_back(b);
    }
    for(int i=0;i<n;i++)
        sort(v[i].begin(),v[i].end());
    go();
    if(d[en]==inf) cout<<-1;
    else cout<<d[en];
}
#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...