Submission #18884

#TimeUsernameProblemLanguageResultExecution timeMemory
18884chan492811Jakarta Skyscrapers (APIO15_skyscraper)C++98
36 / 100
1000 ms34868 KiB
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;

struct data{
    int to,dist;
};
struct cmp{
    bool operator()(data d1,data d2){
        return d1.dist>d2.dist;
    }
};
int n,m;
int dist[30010];
data arr[30010];
bool visit[30010];
vector<data> vt[30010];
priority_queue<data,vector<data>,cmp> pq;

void dij(int a){
    int i;
    data s;
    pq.push((data){a,1});
    while(!pq.empty()){
        a=pq.top().to; pq.pop();
        if(visit[a]) continue; visit[a]=1;
        for(i=0;i<vt[a].size();i++){
            s=vt[a][i];
            if(dist[s.to]==0 || dist[s.to]>dist[a]+s.dist){
                pq.push((data){s.to,dist[a]+s.dist}); dist[s.to]=dist[a]+s.dist;
            }
        }
    }
}
int main(){
    int i,j;
    scanf("%d %d",&n,&m);
    for(i=0;i<m;i++) scanf("%d %d",&arr[i].to,&arr[i].dist);
    for(i=0;i<m;i++){
        for(j=i+1;j<m;j++){
            if(!(abs(arr[i].to-arr[j].to)%arr[i].dist)) vt[i].push_back((data){j,abs(arr[i].to-arr[j].to)/arr[i].dist});
            if(!(abs(arr[i].to-arr[j].to)%arr[j].dist)) vt[j].push_back((data){i,abs(arr[i].to-arr[j].to)/arr[j].dist});
        }
    }
    dist[0]=1;
    dij(0);
    if(!visit[1]) printf("-1");
    else printf("%d",dist[1]-1);
    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...