Submission #1155386

#TimeUsernameProblemLanguageResultExecution timeMemory
1155386vivkostovJakarta Skyscrapers (APIO15_skyscraper)C++20
100 / 100
29 ms6852 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.tim<tim;
    }
};
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;
    ti[a[1].to]=0;
}
void dijkstra()
{
    cell w,nb;
    int start=a[1].to;
    for(int i=0;i<v[start].size();i++)
    {
        nb.st=v[start][i].st;
        nb.to=v[start][i].to;
        nb.tim=ti[start];
        nb.ind=v[start][i].ind;
        q.push(nb);
    }
    int izm=0;
    while(!q.empty())
    {
        w=q.top();
        q.pop();
        if(w.ind==2)
        {
            cout<<w.tim<<endl;
            exit(0);
        }
        if(dogtim[w.ind]<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;
        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<<" "<<w.to<<" "<<w.st<<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...