제출 #1125348

#제출 시각아이디문제언어결과실행 시간메모리
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...