제출 #847207

#제출 시각아이디문제언어결과실행 시간메모리
847207vjudge1Jakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
461 ms23764 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second

const int ar=3e4+5;
const ll mod=1e9+7;

int n,m;
int sqr;
int b[ar];
int p[ar];
int dp[ar][174];
vector<int> ad[ar];
struct seg
{
    int dis,i,p;
};
bool operator>(seg a,seg b)
{
    return a.dis>b.dis;
}
priority_queue<seg,vector<seg>, greater<seg> > pq;
int ans=1e9;
void dijkstra()
{
    memset(dp,0x3f,sizeof dp);
    pq.push({0,b[0],0});
    dp[b[0]][0]=0;
    while(pq.size())
    {
        seg top=pq.top();
        pq.pop();
        int dis=top.dis;
        int i=top.i;
        int pk=top.p;
        if (dp[i][pk]<dis) continue;
        if (i==b[1]) ans=min(ans,dis);
        if (pk==0)
        {
            for (auto x:ad[i])
            {
                if (p[x]<=sqr)
                {
                    if (dp[i][p[x]]>dis)
                    {
                        dp[i][p[x]]=dis;
                        pq.push({dis,i,p[x]});
                    }
                }
                else
                {
                    int cnt=0;
                    for (int j=i;j<n;j+=p[x])
                    {
                        if (dp[j][0]>dis+cnt)
                        {
                            dp[j][0]=dis+cnt;
                            pq.push({dp[j][0],j,0});
                        }
                        cnt++;
                    }
                    cnt=0;
                    for (int j=i;j>=0;j-=p[x])
                    {
                        if (dp[j][0]>dis+cnt)
                        {
                            dp[j][0]=dis+cnt;
                            pq.push({dp[j][0],j,0});
                        }
                        cnt++;
                    }
                }
            }
        }
        else
        {
            if (i+pk<n && dp[i+pk][pk]>dis+1)
            {
                dp[i+pk][pk]=dis+1;
                pq.push({dp[i+pk][pk],i+pk,pk});
            }
            if (i-pk>=0 && dp[i-pk][pk]>dis+1)
            {
                dp[i-pk][pk]=dis+1;
                pq.push({dp[i-pk][pk],i-pk,pk});
            }
            if (dp[i][0]>dis)
            {
                dp[i][0]=dis;
                pq.push({dp[i][0],i,0});
            }
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for (int i=0;i<m;i++)
    {
        cin>>b[i]>>p[i];
        ad[b[i]].push_back(i);
    }
    sqr=sqrt(n);
    dijkstra();
    if (ans==1e9) ans=-1;
    cout<<ans;
///
}
#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...