제출 #679855

#제출 시각아이디문제언어결과실행 시간메모리
67985579brueJakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
249 ms94812 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int G = 175; struct dat{ int x, doge, dist; dat(){} dat(int x, int doge, int dist): x(x), doge(doge), dist(dist){} }; int n, k; bool visited1[30002][180]; bool visited2[30002][180]; bool started[30002]; int st[30002], a[30002], b[30002], idx[30002]; vector<int> lst[30002]; dat que[10000002]; int que_size, que_front; dat pop(){ return que[que_front++]; } void push(dat tmp){ que[que_size++] = tmp; } inline bool chk(int d, int x){ if(b[d] <= G) return visited1[x][b[d]]; return visited2[idx[d]][x/b[d]]; } inline void mark(int d, int x){ if(b[d] <= G) visited1[x][b[d]] = 1; else visited2[idx[d]][x/b[d]] = 1; } inline void go(dat &tmp){ int r = b[tmp.doge]; if(tmp.x - r >= 0 && !chk(tmp.doge, tmp.x - r)) mark(tmp.doge, tmp.x-r), push(dat(tmp.x - r, tmp.doge, tmp.dist+1)); if(tmp.x + r < n && !chk(tmp.doge, tmp.x + r)) mark(tmp.doge, tmp.x+r), push(dat(tmp.x + r, tmp.doge, tmp.dist+1)); } int main(){ scanf("%d %d", &n, &k); for(int i=1; i<=k; i++){ scanf("%d %d", &st[i], &b[i]); a[i] = st[i] % b[i]; lst[st[i]].push_back(i); } vector<pair<int, int> > vec; for(int i=1; i<=k; i++) vec.push_back(make_pair(a[i], b[i])); sort(vec.begin(), vec.end()); for(int i=1; i<=k; i++){ int tmp = lower_bound(vec.begin(), vec.end(), make_pair(a[i], b[i])) - vec.begin() + 1; idx[i] = tmp; } push(dat(st[1], 1, 0)); mark(1, st[1]); while(que_size != que_front){ dat tmp = pop(); // printf("x: %d, doge: %d, dist: %d\n", tmp.x, tmp.doge, tmp.dist); if(tmp.doge == 2){ printf("%d", tmp.dist); return 0; } if(!started[tmp.x]){ started[tmp.x] = 1; for(int d: lst[tmp.x]){ if(d == 2){ printf("%d", tmp.dist); return 0; } if(chk(d, tmp.x)) continue; mark(d, tmp.x); dat tmp2 = dat(tmp.x, d, tmp.dist); go(tmp2); } } go(tmp); } printf("-1"); }

컴파일 시 표준 에러 (stderr) 메시지

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:49:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 |     scanf("%d %d", &n, &k);
      |     ~~~~~^~~~~~~~~~~~~~~~~
skyscraper.cpp:51:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   51 |         scanf("%d %d", &st[i], &b[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...