제출 #1125433

#제출 시각아이디문제언어결과실행 시간메모리
1125433ASN49KJakarta Skyscrapers (APIO15_skyscraper)C++20
57 / 100
1101 ms124844 KiB
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(),x.end()
#define pb push_back
#define bug(a) std::cerr << "(" << #a << ": " << a << ")\n";

using i64 = long long;
const int N=30'000;
struct cord
{
    int pos,step;
    bool operator <(const cord &b)const
    {
        if(pos==b.pos)
        {
            return step<b.step;
        }
        return pos<b.pos;
    }
    bool operator ==(const cord &b)const
    {
        return pos==b.pos && step==b.step;
    }
};
struct hashPi {
	size_t operator()(const cord &p) const { return 30'000*p.pos+p.step; }
};

unordered_map<cord , int , hashPi>dist;
vector<int>adj[N];


int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;
    cin>>n>>m;
    vector<cord>cords(m);
    for(auto &c:cords)
    {
        cin>>c.pos>>c.step;
        adj[c.pos].push_back(c.step);
    }
    deque<cord>q;
    q.push_front(cords[0]);
    vector<bool>viz(n,0);

    auto insert=[&](cord nextt,int cost,bool fronted)
    {
        if(!dist.count(nextt) || dist[nextt]>cost)
        {
            dist[nextt]=cost;
            if(fronted)
            {
                q.push_front(nextt);
            }
            else
            {
                q.push_back(nextt);
            }
        }
    };
    while(q.size())
    {
        cord then=q.front();
        int then_cost=dist[then];
        q.pop_front();
        if(then.pos==cords[1].pos)
        {
            cout<<then_cost<<'\n';
            return 0;
        }


        if(!viz[then.pos])
        {
            viz[then.pos]=true;
            for(auto &c:adj[then.pos])
            {
                insert((cord){then.pos , c} , then_cost , true);
            }
            adj[then.pos].clear();
        }
        if(then.pos>=then.step)
        {
            insert({then.pos-then.step , then.step} , then_cost+1 , false);
        }
        if(then.pos+then.step<n)
        {
            insert({then.pos+then.step , then.step} , then_cost+1 , false);
        }
        assert(dist.size()<=10'000'000);
    }
    cout<<-1;
}
#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...