Submission #77028

#TimeUsernameProblemLanguageResultExecution timeMemory
77028vexJakarta Skyscrapers (APIO15_skyscraper)C++14
36 / 100
711 ms263168 KiB
#include <bits/stdc++.h>
#define maxn 30005
#define pii pair<int,int>
#define f first
#define s second
using namespace std;
 
int n,m;
pii dg[maxn];
vector<int>p[maxn];
 
vector<pii>adj[maxn];
priority_queue<pii>pq;
int dis[maxn];
bool bio[maxn];
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
 
    cin>>n>>m;
    int s;
    int e;
    for(int i=0;i<m;i++)
    {
        int x,y;
        cin>>x>>y;
        dg[i].f=x;
        dg[i].s=y;
        if(i==0)s=x;
        if(i==1)e=x;
        p[y].push_back(x);
    }
    for(int i=1;i<n;i++)sort(p[i].begin(),p[i].end());
    for(int i=0;i<m;i++)
    {
	int pp=0;
      	int sz=p[dg[i].s].size();
      	while(p[dg[i].s][pp]!=dg[i].f)pp++;
 
	int up=pp+1;
      	for(int j=dg[i].f+dg[i].s;j<n;j+=dg[i].s)
        {
          	while(up<sz && p[dg[i].s][up]<j)up++;
          	adj[dg[i].f].push_back({j,(j-dg[i].f)/dg[i].s});
          	if(up<sz && p[dg[i].s][up]==j)break; 
        }
      	
      	pp--;
      	for(int j=dg[i].f-dg[i].s;j>=0;j-=dg[i].s)
        {
          	while(pp>=0 && p[dg[i].s][pp]>j)pp--;
            adj[dg[i].f].push_back({j,(dg[i].f-j)/dg[i].s});
            if(pp>=0 && p[dg[i].s][pp]==j)break; 
        }
    }
    
    /*for(int i=0;i<n;i++)
    {
    	cout<<i<<"   ";
    	for(auto x:adj[i])cout<<x.f<<","<<x.s<<" ";
    	cout<<endl;
    }*/
 
    if(e==s)
    {
        cout<<"0"<<endl;
        return 0;
    }
 
    for(int i=0;i<n;i++)
    {
        dis[i]=maxn*maxn+55;
        bio[i]=false;
    }
    pq.push({0,s});
    dis[s]=0;
 
    while(!pq.empty())
    {
        int v=pq.top().second;
        pq.pop();
      	if(v==e)
        {
          cout<<dis[e]<<endl;
          return 0;
        }
        if(bio[v])continue;
        bio[v]=true;
 
        for(auto x:adj[v])
        {
    		int u=x.f;
          	int w=x.s;
          	if(dis[u]>dis[v]+w)
            {
              	dis[u]=dis[v]+w;
              	pq.push({-dis[u],u});
            }
        }
    }
 
    cout<<"-1"<<endl;
    return 0;
}

Compilation message (stderr)

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:85:8: warning: 'e' may be used uninitialized in this function [-Wmaybe-uninitialized]
        if(v==e)
        ^~
#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...