Submission #298644

#TimeUsernameProblemLanguageResultExecution timeMemory
298644errorgornJakarta Skyscrapers (APIO15_skyscraper)C++14
100 / 100
102 ms7036 KiB
#include <cstdio>
#include <queue>
#include <utility>
#include <cstring>
using namespace std;
typedef pair<int,int> ii;

const int SQRTN=300;
const int MAXN=30005;

int n,k;
int w[MAXN];
bool pow[SQRTN][MAXN];
vector<int> power[MAXN];
priority_queue<ii,vector<ii>,greater<ii> > pq;


int main(){
    scanf("%d%d",&n,&k);
    
    int a,b;
    int s,t;
    for (int x=0;x<k;x++){
        scanf("%d%d",&a,&b);
        
        if (x==0) s=a;
        else if (x==1) t=a;
        if (b<SQRTN){
            if (pow[b][a]) continue;
            pow[b][a]=true;
            power[a].push_back(b);
        }
        else{
            power[a].push_back(b);
        }
    }
    
    memset(w,127,sizeof(w));
    w[s]=0;
    pq.push(ii(w[s],s));
    
    int node,weight;
    while (!pq.empty()){
        node=pq.top().second,weight=pq.top().first,pq.pop();
        //printf("%d %d\n",node,weight);
        
        if (w[node]!=weight) continue;
        if (node==t){
            printf("%d\n",weight);
            return 0;
        }
        
        for (auto &p:power[node]){
            for (int x=node-p;x>=0;x-=p){
                if (w[x]>weight+(node-x)/p){
                    w[x]=weight+(node-x)/p;
                    pq.push(ii(w[x],x));
                }
                if (p<SQRTN && pow[p][x]) break;
            }
            for (int x=node+p;x<MAXN;x+=p){
                if (w[x]>weight+(x-node)/p){
                    w[x]=weight+(x-node)/p;
                    pq.push(ii(w[x],x));
                }
                if (p<SQRTN && pow[p][x]) break;
            }
        }
    }
    
    printf("-1\n");
}

Compilation message (stderr)

skyscraper.cpp:13:6: warning: built-in function 'pow' declared as non-function [-Wbuiltin-declaration-mismatch]
   13 | bool pow[SQRTN][MAXN];
      |      ^~~
skyscraper.cpp: In function 'int main()':
skyscraper.cpp:19:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   19 |     scanf("%d%d",&n,&k);
      |     ~~~~~^~~~~~~~~~~~~~
skyscraper.cpp:24:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   24 |         scanf("%d%d",&a,&b);
      |         ~~~~~^~~~~~~~~~~~~~
skyscraper.cpp:22:9: warning: 's' may be used uninitialized in this function [-Wmaybe-uninitialized]
   22 |     int s,t;
      |         ^
skyscraper.cpp:48:9: warning: 't' may be used uninitialized in this function [-Wmaybe-uninitialized]
   48 |         if (node==t){
      |         ^~
#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...