Submission #1277240

#TimeUsernameProblemLanguageResultExecution timeMemory
1277240quanduongxuan12Jakarta Skyscrapers (APIO15_skyscraper)C++20
100 / 100
108 ms7488 KiB
#include <bits/stdc++.h> using namespace std; #define name "jakarta" #define MAXN 30004 #define pb push_back #define pf push_front #define ll long long #define ii pair<int, int> #define fs first #define sc second #define ill pair<int, ll> #define lli pair<ll, int> #define llll pair<ll, ll> #define all(v) v.begin(),v.end() #define uni(v) v.erase(unique(all(v)),v.end()) #define bit(n,i) (((n)>>(i))&1) #define FOR(i,a,b) for (int i=(a),_b=(b); i<=_b; i++) #define FORD(i,a,b) for (int i=(a),_b=(b); i>=_b; i--) #define MASK(i) (1LL<<(i)) const int INF=1e9; const int MOD=1e9+7; void add(int &u, int v){ u+=v; if (u>=MOD) u-=MOD; } void sub(int &u, int v){ u-=v; if (u<0) u+=MOD; } void minimize(int &u, int v){ u=min(u,v); } void maximize(int &u, int v){ u=max(u,v); } long long Rand(long long l, long long r){ ll tmp=0; FOR(i,1,4) tmp=((tmp<<15)^(((1<<15)-1)&rand())); return l+tmp%(r-l+1); } #define iiii pair<ii,ii> int n,m; int b[MAXN],p[MAXN]; const int BLOCKS=175; bool visited[MAXN][BLOCKS+1]; int dp[MAXN]; vector<int> vec[MAXN]; int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin>>n>>m; FOR(i,1,m) cin>>b[i]>>p[i]; FOR(i,1,m) ++b[i]; FOR(i,1,m) vec[b[i]].pb(p[i]); memset(dp,0x3f,sizeof(dp)); dp[b[1]]=0; queue<iiii> Q; Q.push((iiii){{0,-1},{b[1],p[1]}}); if (p[1]<=BLOCKS) visited[b[1]][p[1]]=1; while (Q.size()){ iiii tmp=Q.front(); Q.pop(); int u=tmp.sc.fs; int w=tmp.sc.sc; int d=tmp.fs.fs; int prev=tmp.fs.sc; while (1){ if (w<=BLOCKS){ int v; v=u-w; if (v!=prev&&v>=1&&!visited[v][w]){ visited[v][w]=1; minimize(dp[v],d+1); Q.push((iiii){{d+1,u},{v,w}}); } v=u+w; if (v!=prev&&v<=n&&!visited[v][w]){ visited[v][w]=1; minimize(dp[v],d+1); Q.push((iiii){{d+1,u},{v,w}}); } } else{ int v; v=u-w; if (v!=prev&&v>=1){ minimize(dp[v],d+1); Q.push((iiii){{d+1,u},{v,w}}); } v=u+w; if (v!=prev&&v<=n){ minimize(dp[v],d+1); Q.push((iiii){{d+1,u},{v,w}}); } } if (vec[u].size()==0) break; w=vec[u].back(); vec[u].pop_back(); } } cout<<(dp[b[2]]==dp[0]?-1:dp[b[2]]); 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...