Submission #1125348

#TimeUsernameProblemLanguageResultExecution timeMemory
1125348ender_shayanJakarta Skyscrapers (APIO15_skyscraper)C++20
57 / 100
1098 ms99160 KiB
#include <bits/stdc++.h>

using namespace std;

//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//using namespace __gnu_pbds;

typedef long long ll;
typedef long double	ld;
typedef pair<int, int>	pii  ;
typedef pair<ll, ll>	pll  ;
typedef vector<pii>     vii  ;
typedef vector<int>     veci ;
typedef vector<pll>     vll  ;
typedef vector<ll>      vecll;
typedef unsigned short int sh;

// find_by_order             order_of_key

//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt"
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define F		        first
#define S		        second
#define pb		        push_back
#define endl            '\n'
#define Mp		        make_pair
#define all(x)          x.begin(), x.end()
#define debug(x)        cerr << #x << " = " << x << endl
#define set_dec(x)	    cout << fixed << setprecision(x);
#define fast_io         ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io         freopen("in.txt" , "r" , stdin) ; freopen("out.txt" , "w" , stdout);
#define lb              lower_bound
#define ub              upper_bound
#define for1(n)         for(int i=1;i<=n;i++)
#define for0(n)         for(sh i=0;i<n;i++)
#define forn(n)         for(int i=n;i>0;i--)
#define pq              priority_queue <pii, vector<pii>, greater<pii>>



int inf=1e9+10;
const sh N=3e4+1;
sh n,m,k;
unordered_map<sh,int> dist[N];
vector<sh>g[N];
pair<sh,sh> A[N];
deque<pair<sh,sh>>q;
void add1(int x,int p,int w){
    if(dist[x][p]<=w && dist[x][p])return;
    dist[x][p]=w;
    q.push_front({x,p});
}
void add2(int x,int p,int w){
    if(dist[x][p]<=w+1 && dist[x][p])return;
    dist[x][p]=w+1;
    q.pb({x,p});
}
void bfs(){
    dist[A[0].F][A[0].S]=1;q.pb(A[0]);
    while(q.size()){
        sh x=q.front().F,p=q.front().S;q.pop_front();
        int w=dist[x][p];
        short int t=ub(all(g[x]),p)-g[x].begin();

        if(t!=g[x].size())
            add1(x,g[x][t],w);

        t=lb(all(g[x]),p)-g[x].begin()-1;

        if(t!=-1)
            add1(x,g[x][t],w);
        short int s=x;s-=p;
        if(s>=0)
            add2(s,p,w);
        if(x+p<n)
            add2(x+p,p,w);
    }
}
int32_t main(){
    fast_io
    cin>>n>>m;
    for0(m){
        int x,p;cin>>x>>p;
        A[i]={x,p};
        g[x].pb(p);
    }
    for0(n){sort(all(g[i]));g[i].resize(unique(all(g[i]))-g[i].begin());}
    bfs();
    if(!dist[A[1].F][A[1].S])return cout<<"-1\n",0;
    cout<<dist[A[1].F][A[1].S]-1<<endl;
    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...