Submission #26416

#TimeUsernameProblemLanguageResultExecution timeMemory
26416zscoderJakarta Skyscrapers (APIO15_skyscraper)C++14
57 / 100
1000 ms211004 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define fi first #define se second #define mp make_pair #define pb push_back #define fbo find_by_order #define ook order_of_key typedef long long ll; typedef pair<int,int> ii; typedef vector<ll> vi; typedef long double ld; typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds; typedef set<int>::iterator sit; typedef map<int,int>::iterator mit; typedef vector<int>::iterator vit; const int INF = int(1e9); const int C = 62; const int N = 30001*C; vector<ii> adj[N+30001]; int dist[N+30001]; void addedge(int u, int v, int w) { adj[u].pb(mp(v,w)); } int getid(int u, int v) { return (u*C+v); } set<int> S[30001]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n,m; cin>>n>>m; int s,e; for(int i=0;i<m;i++) { int x,y; cin>>x>>y; if(i==0) s=x; if(i==1) e=x; S[x].insert(y); } for(int i=0;i<n;i++) { for(sit it = S[i].begin(); it != S[i].end(); it++) { int y=(*it); if(y<C) { addedge(i+N,getid(i,y),0); /* if(i-y>=0) { addedge(getid(i,y),getid(i-y,y),1); //addedge(getid(i,y),i-y+N,1); } if(i+y<n) { addedge(getid(i,y),getid(i+y,y),1); //addedge(getid(i,y),i+y+N,1); } */ } else { int cnt=0; for(int j=i+y;j<n;j+=y) { addedge(i+N,j+N,++cnt); } cnt=0; for(int j=i-y;j>=0;j-=y) { addedge(i+N,j+N,++cnt); } } } } for(int i=0;i<n;i++) { for(int j=1;j<C;j++) { if(i-j>=0) { addedge(getid(i,j),i-j+N,1); addedge(getid(i,j),getid(i-j,j),1); } if(i+j<n) { addedge(getid(i,j),getid(i+j,j),1); addedge(getid(i,j),i+j+N,1); } } } e+=N; s+=N; priority_queue<ii,vector<ii>,greater<ii> > pq; for(int i=0;i<N+30001;i++) dist[i]=INF; pq.push(mp(0,s)); dist[s]=0; while(!pq.empty()) { int d = pq.top().fi; int u = pq.top().se; pq.pop(); //cerr<<d<<' '<<u<<'\n'; for(int i=0;i<adj[u].size();i++) { int v=adj[u][i].fi; int w=adj[u][i].se; if(d+w<dist[v]) { dist[v]=d+w; pq.push(mp(dist[v],v)); } } } if(dist[e]>=INF) dist[e]=-1; cout<<dist[e]<<'\n'; }

Compilation message (stderr)

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:118:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<adj[u].size();i++)
                ^
skyscraper.cpp:109:6: warning: 's' may be used uninitialized in this function [-Wmaybe-uninitialized]
  s+=N;
      ^
skyscraper.cpp:108:6: warning: 'e' may be used uninitialized in this function [-Wmaybe-uninitialized]
  e+=N;
      ^
#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...