Submission #1154330

#TimeUsernameProblemLanguageResultExecution timeMemory
1154330NewtonabcJakarta Skyscrapers (APIO15_skyscraper)C++20
100 / 100
223 ms71392 KiB
#include<bits/stdc++.h>
using namespace std;
const int N=3e4+10;
vector<pair<int,int>> adj[N];
int d[N];
//check if it has p[i] in that node already or not
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
vector<pair<int,int>> v;
bool vs[N];
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n,m,st,ed,a,b,tmp,u;
    cin>>n >>m;
    for(int i=0;i<m;i++){
        cin>>b >>a;
        if(i==0) st=b;
        if(i==1) ed=b;
        //p[i],pos[i]
        v.push_back({a,b});
    }
    if(m==1){
        cout<<-1;
        return 0;
    }
    //cout<<st <<" " <<ed <<"\n";
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    for(auto [pow,pos]:v){
        //forward
        for(int i=pos+pow;i<n;i+=pow){
            tmp=(i-pos)/pow;
            adj[pos].push_back({i,tmp});
            if(*(lower_bound(v.begin(),v.end(),make_pair(pow,i)))==make_pair(pow,i)) break;
            //cout<<pos <<" " <<i <<" " <<tmp <<"\n";
        }
        //backward
        for(int i=pos-pow;i>=0;i-=pow){
            tmp=(pos-i)/pow;
            adj[pos].push_back({i,tmp});
            if(*(lower_bound(v.begin(),v.end(),make_pair(pow,i)))==make_pair(pow,i)) break;
            //cout<<pos <<" " <<i <<" " <<tmp <<"\n";
        }
    }
    for(int i=0;i<n;i++) d[i]=INT_MAX;
    d[st]=0;
    q.push({0,st});
    while(!q.empty()){
        u=q.top().second;
        q.pop();
        if(vs[u]) continue;
        vs[u]=true;
        for(auto [v,w]:adj[u]){
            if(d[u]+w<d[v]){
                d[v]=d[u]+w;
                q.push({d[v],v});
            }
        }
    }
    if(d[ed]==INT_MAX) cout<<-1;
    else cout<<d[ed];
}
#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...