제출 #1155379

#제출 시각아이디문제언어결과실행 시간메모리
1155379vivkostovJakarta Skyscrapers (APIO15_skyscraper)C++20
0 / 100
2 ms2632 KiB
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}
struct cell
{
    int to,st,tim,ind;
    bool operator<(const cell&a)const
    {
        return a.st>st;
    }
};
int n,m,used[505][505],ti[100005],dogtim[100005];
cell a[100005];
vector<cell>v[100005];
priority_queue<cell>q;
void prec()
{
    for(int i=1;i<=n;i++)
    {
        ti[i]=1e9;
    }
    for(int j=1;j<=m;j++)
    {
        dogtim[j]=1e9;
    }
    dogtim[1]=0;
}
void dijkstra()
{
    cell w,nb;
    w.st=a[1].st;
    w.to=a[1].to;
    w.ind=1;
    w.tim=0;
    q.push(w);
    int izm=0;
    while(!q.empty())
    {
        w=q.top();
        q.pop();
        if(w.ind==2)
        {
            cout<<w.tim<<endl;
            exit(0);
        }
        if(dogtim[w.tim]<w.tim)continue;
        if(w.st<300)
        {
            if(used[w.st][w.to%w.st])continue;
            used[w.st][w.to%w.st]=1;
        }
        izm=0;
        //cout<<w.ind<<" "<<w.st<<" "<<w.to<<endl;
        for(int i=w.to+w.st;i<=n;i+=w.st)
        {
            izm++;
            if(ti[i]<=w.tim+izm)continue;
            ti[i]=w.tim+izm;
            //cout<<w.ind<<" "<<i<<endl;
            for(int j=0;j<v[i].size();j++)
            {
                nb.st=v[i][j].st;
                nb.to=i;
                nb.tim=ti[i];
                nb.ind=v[i][j].ind;
                q.push(nb);
                dogtim[v[i][j].ind]=ti[i];
            }
        }
        izm=0;
        for(int i=w.to-w.st;i>=1;i-=w.st)
        {
            izm++;
            if(ti[i]<=w.tim+izm)continue;
            ti[i]=w.tim+izm;
            for(int j=0;j<v[i].size();j++)
            {
                nb.st=v[i][j].st;
                nb.to=i;
                nb.tim=ti[i];
                nb.ind=v[i][j].ind;
                q.push(nb);
                dogtim[v[i][j].ind]=ti[i];
            }
        }
    }
}
void read()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>a[i].to>>a[i].st;
        a[i].to++;
        a[i].ind=i;
        v[a[i].to].push_back(a[i]);
    }
    //cout<<endl;
    prec();
    dijkstra();
    cout<<-1<<endl;
}
int main()
{
    speed();
    read();
    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...