QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#546034#6306. Chase GameRillloWA 0ms3804kbC++141.9kb2024-09-03 19:05:362024-09-03 19:05:36

Judging History

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

  • [2024-09-03 19:05:36]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3804kb
  • [2024-09-03 19:05:36]
  • 提交

answer

#include <bits/stdc++.h>

using i64 = long long;

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int n, m, k, d;
	std::cin >> n >> m >> k >> d;
	k--;
	std::vector<std::vector<int>> adj(n);
	for (int i = 0; i < m; i++) {
		int x, y;
		std::cin >> x >> y;
		x--, y--;
		adj[x].push_back(y);
		adj[y].push_back(x);
	}
	i64 inf = 1E12;
	std::vector<int> p(n), dis(n, n);
	std::vector<i64> dp(n,inf);
	p[k] = d;
	std::queue<int> q;
	q.push(k);
	
	while (!q.empty()) {
		auto x = q.front();
		q.pop();

		if (p[x] == 1) {
			continue;
		}

		for (auto y : adj[x]) {
			if (p[y] == 0) {
				p[y] = p[x] - 1;
				q.push(y);
			}
		}
	}

	std::priority_queue<std::pair<i64,int>, std::vector<std::pair<i64, int>>, std::greater<>> h;
	for(auto v : adj[0]){
		if(p[v]!=0){
			dp[v]=p[v];
			h.push({dp[v], v});
		}
	}
	
	while (!q.empty()) q.pop();
	dis[n - 1] = 0;
	q.push(n - 1);
	while (!q.empty()) {
		int x = q.front();
		q.pop();

		for (auto y : adj[x]) {
			if (dis[y] > dis[x] + 1) {
				dis[y] = dis[x] + 1;
				q.push(y);
			}
		}
	}
	for (int i = 0; i < n; i++) {
		dis[i]++;
	}
	i64 ans = inf;
	ans = std::min(ans, dp[n - 1]);

	auto cal = [&](int x) {
		i64 time = 1LL * x / d * (1 + d) * d / 2; 
		x %= d;
		if (x > 0) {
			time += 1LL * (2 * d - x + 1) * x / 2;
		}
		return time;
	};
	while (!h.empty()) {
		auto [val, x] = h.top();
		h.pop();

		// std::cout << x << " " << val << "\n";
		if (val > dp[x]) {
			continue;
		}	

		for (auto y : adj[x]) {
			if (p[y] == 0) {
				ans = std::min(ans, val + cal(dis[y]));
				// std::cout << x << " " << val << " " << cal(dis[x]) << "\n";
			} else if (dp[y] > dp[x] + p[y]) {
				dp[y] = dp[x] + p[y];
				h.emplace(dp[y], y);
			}
		}
	}
	for(auto v:adj[0]) {
		if (p[v] == 0) {
			ans = std::min(ans, cal(dis[v]));
		}
	}
	std::cout << ans << "\n";

	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3608kb

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

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

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: 0
Accepted
time: 0ms
memory: 3608kb

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:

1

result:

ok 1 number(s): "1"

Test #5:

score: 0
Accepted
time: 0ms
memory: 3580kb

input:

10 20 3 1
1 4
6 7
5 4
5 3
2 1
8 1
7 8
2 6
2 4
4 8
9 5
1 10
7 4
5 8
4 10
2 5
6 10
4 6
3 7
1 3

output:

1

result:

ok 1 number(s): "1"

Test #6:

score: 0
Accepted
time: 0ms
memory: 3548kb

input:

10 20 4 1
2 7
6 4
2 3
2 4
6 5
8 5
6 7
10 2
3 10
1 8
3 9
3 7
1 7
5 1
6 1
3 4
2 1
5 2
9 2
9 10

output:

2

result:

ok 1 number(s): "2"

Test #7:

score: -100
Wrong Answer
time: 0ms
memory: 3492kb

input:

10 20 1 10
10 9
2 5
7 8
7 10
10 8
8 9
5 6
3 1
6 4
7 9
2 3
3 6
2 1
8 6
5 8
7 4
4 3
2 4
4 1
9 6

output:

1000000000000

result:

wrong answer 1st numbers differ - expected: '24', found: '1000000000000'