제출 #124120

#제출 시각아이디문제언어결과실행 시간메모리
124120MtaylorJakarta Skyscrapers (APIO15_skyscraper)C++14
10 / 100
27 ms24028 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<ll> vl ; #define mp make_pair #define pb push_back #define f first #define s second #define all(v) (v).begin(),(v).end() const int MOD = 1000000007; const int N = 1000005; const double PI =4*atan(1); const double eps = 1e-7; ll n,m; ll x,y; vl tab[N]; ll p[N]; ll b[N]; bool vis[N]; unordered_map<ll ,ll> maa; ll ans=-1; void bfs(ll u){ deque<pair<ll,ll> > pq; for(auto t:tab[u]){ pq.push_back(mp(0,u*50000 + p[t])); } vis[u]=1; pair<ll,ll> ras; while(!pq.empty()){ ras=pq.front(); pq.pop_front(); ll x=ras.s/50000; ll y=ras.s%50000; if(x==b[1]){ ans=max(ans,-ras.f); continue ; } //cout << x << " " << y << endl; ll z=maa[50000*(x+y)+y]; if(x+y <n && (z==0 || (z!=0 && -ras.f+1<z))){ maa[50000*(x+y)+y]=-ras.f+1; if(x+y == b[1]){ ans=max(ans,-ras.f+1); continue;; } pq.push_back(mp(ras.f-1,50000*(x+y)+y)); } z=maa[50000*(x-y)+y]; if(x-y >=0 && (z==0 || (z!=0 && -ras.f+1<z))){ maa[50000*(x-y)+y]=-ras.f+1; if(x-y == b[1]){ ans=max(ans,-ras.f+1); continue; } pq.push_back(mp(ras.f-1,50000*(x-y)+y)); } //cout << x << endl; if(vis[x])continue; for(auto t: tab[x]){ z=maa[x*50000+p[t]]; if(z==0 || (z!=0 && -ras.f+1 <z)){ pq.push_front(mp(ras.f,x*50000+p[t] )); maa[x*50000+p[t]]=-ras.f+1; } } vis[x]=1; } } int main(){ ios::sync_with_stdio(0); //freopen("easy.txt","r",stdin); cin >> n >>m ; for(int i=0;i<m;i++){ cin >> x >> y; p[i]=y; b[i]=x; tab[x].pb(i); } //cout << b[0]<< endl; bfs(b[0]); cout << ans; 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...