QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#628281#6306. Chase GameTokaiZaopenWA 1ms5828kbC++203.1kb2024-10-10 19:26:022024-10-10 19:26:05

Judging History

你现在查看的是最新测评结果

  • [2024-10-10 19:26:05]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:5828kb
  • [2024-10-10 19:26:02]
  • 提交

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];
bool board[100010];
bool in[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});
    }

    dij(a, n);
    int now = d;
    for (int i = 1; i <= n; i++)
    {
        sum[i] = sum[i - 1] + now;
        now--;
        if (now <= 0)
            now = d;
    }
    for (int i = 1; i <= n; i++)
        w[i] = dis[i];

    dij(a, pos);
    vector<int> ter;
    for (int i = 1; i <= n; i++)
    {
        if (dis[i] == d && i != 1)
            ter.push_back(i);
        for (auto it : a[i])
        {
            int to = it.to;
            if (dis[to] < d)
                b[i].push_back({to, d - dis[to]});
            if (dis[i] == d)
            {
                b[to].push_back({i, sum[w[i] + 1]});
            }
        }
    }
    if (dis[n] < d)
        ter.push_back(n);
    int ans = inf;
    if (dis[1] > d)
        ans = sum[w[1]];
    dij(b, 1);

    for (int i = 0; i < ter.size(); i++)
    {
#ifdef MING_LE
        cout << i << " " << ter[i] << " " << dis[ter[i]] << '\n';
#endif
        ans = min(ans, dis[ter[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});
            }
        }
    }
}

/*
5 5 3 1
1 2
2 4
4 5
1 3
3 5
*/

/*
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
*/

/*
5 4 3 3
1 2
2 3
3 4
4 5
*/

/*
6 6 4 1
1 3
3 6
1 2
2 4
4 5
5 6
*/

/*
6 7 2 3
1 2
1 3
2 4
3 4
4 6
2 5
5 6
*/

/*
20 26 4 4
1 2
2 3
3 4
4 5
5 6
6 19
4 8
4 9
4 10
4 11
4 12
4 13
1 14
14 8
14 15
15 9
15 16
16 10
16 17
17 11
17 18
18 12
18 7
7 13
19 7
19 20
*/

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 3572kb

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: 3856kb

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: 5828kb

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: 3616kb

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'