이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
typedef long long ll;
#define FOR(i, x, y) for(ll i=x; i<y; i++)
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set tree<ll, null_type,greater_equal<int>, rb_tree_tag,tree_order_statistics_node_update>
int n,m;
int a,b,baka,imposter,sus, countz,sussy;
vector<vector<int> > edges[30000];
unordered_set <int> stuff[30000];
int dists[30001];
int main(){
FOR(i, 0, 30001){
dists[i] = 2147483647;
}
cin >> n>>m;
FOR(i, 0, m){
cin >> a >> b;
if(i==0) imposter = a;
if (i==1) baka = a;
stuff[a].insert(b);
}
FOR(k, 0, n){
for(auto&i : stuff[k]){
sus = k;
sussy = i;
countz = 0;
while ((sus+sussy)<n){
sus += sussy;
countz++;
edges[k].push_back({sus, countz});
if (stuff[sus].find(i) != stuff[sus].end()) break;
}
sus = k;
countz = 0;
while ((sus-sussy)>=0){
sus -= sussy;
countz++;
edges[k].push_back({sus, countz});
if (stuff[sus].find(i) != stuff[sus].end()) break;
}
}
}
int src=imposter;
priority_queue<vector<int>,vector<vector<int>>, greater<vector<int>>> pq;
dists[src] = 0;
pq.push({0, src});
while (pq.size()) {
vector<int> suz = pq.top();
int cdist, node;
pq.pop();
cdist = suz[0];node=suz[1];
if (cdist != dists[node]) continue;
for (auto& i : edges[node]) {
if (cdist+i[1] < dists[i[0]]) {
pq.push({dists[i[0]] = cdist+i[1], i[0]});
}
}
}
if (dists[baka] != 2147483647){
cout << dists[baka];
}else{
cout << -1;
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |