QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#628035 | #6306. Chase Game | TokaiZaopen | WA | 0ms | 3840kb | C++23 | 2.8kb | 2024-10-10 18:19:30 | 2024-10-10 18:19:33 |
Judging History
answer
#include <bits/stdc++.h>
#define int ll
using ll = long long;
// #define MING_LE
const int mod = 998244353;
const int inf = 1e18;
using namespace std;
struct info
{
int to;
int w;
};
struct node
{
int dis;
int u;
bool operator>(const node &o) const
{
return dis > o.dis;
}
};
int n, m;
int pos, d;
vector<vector<info>> a;
vector<vector<info>> b;
int dis[100010];
int w[100010];
int sum[100010];
bool vis[100010];
void dij(vector<vector<info>> &e, int st);
void solve();
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int __ = 1;
// cin >> __;
while (__--)
solve();
return 0;
}
void solve()
{
cin >> n >> m >> pos >> d;
a.resize(n + 5);
b.resize(n + 5);
for (int i = 1; i <= m; i++)
{
int u, v;
cin >> u >> v;
a[u].push_back({v, 1});
a[v].push_back({u, 1});
}
vector<bool> viss(n + 1);
int now = d;
for (int i = 1; i <= n; i++)
{
sum[i] = sum[i - 1] + now;
now--;
if (now <= 0)
now = d;
}
dij(a, pos);
for (int i = 1; i <= n; i++)
{
if (dis[i] == d - 1)
{
viss[i] = 1;
}
for (auto it : a[i])
{
int to = it.to;
if (dis[to] >= d)
continue;
b[i].push_back({to, d - dis[to]});
}
}
bool flag = 1;
for (auto it : a[1])
{
if (dis[it.to] >= d)
{
/* code */
}
else
{
flag = 0;
}
}
if (dis[1] < d)
{
flag = 0;
}
if (flag)
{
dij(a, n);
cout << sum[dis[1]] << '\n';
return;
}
dij(a, n);
sum[0] = 0;
for (int i = 1; i <= n; i++)
{
if (dis[i] < inf)
w[i] = sum[dis[i]];
else
w[i] = inf;
}
dij(b, 1);
int ans = dis[n];
for (int i = 1; i <= n; i++)
{
if (viss[i])
{
ans = min(ans, dis[i] + w[i]);
}
}
cout << ans << '\n';
}
void dij(vector<vector<info>> &e, int st)
{
for (int i = 1; i <= n; i++)
{
vis[i] = 0;
dis[i] = inf;
}
dis[st] = 0;
priority_queue<node, vector<node>, greater<node>> q;
q.push({dis[st], st});
while (!q.empty())
{
int x = q.top().u;
q.pop();
if (vis[x])
continue;
vis[x] = 1;
for (auto it : e[x])
{
int u = it.to, w = it.w;
if (dis[u] > dis[x] + w)
{
dis[u] = dis[x] + w;
q.push({dis[u], u});
}
}
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3788kb
input:
5 5 3 1 1 2 2 4 4 5 1 3 3 5
output:
2
result:
ok 1 number(s): "2"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3620kb
input:
13 17 12 3 1 2 2 3 3 4 4 13 5 13 7 8 7 9 7 10 7 11 7 6 12 7 1 8 8 9 9 10 10 11 11 6 6 13
output:
7
result:
ok 1 number(s): "7"
Test #3:
score: 0
Accepted
time: 0ms
memory: 3840kb
input:
10 9 4 1 4 3 1 2 7 6 6 5 8 9 9 10 5 4 8 7 3 2
output:
9
result:
ok 1 number(s): "9"
Test #4:
score: -100
Wrong Answer
time: 0ms
memory: 3572kb
input:
10 20 9 1 9 5 2 9 4 5 10 5 7 3 1 8 7 1 7 5 3 4 3 1 7 8 3 8 9 3 10 6 9 1 1 6 8 5 6 2 1 10 2 1
output:
3
result:
wrong answer 1st numbers differ - expected: '1', found: '3'