CF1968D 题解

思路

首先他们两人都一定是移动一段时间后永远停在某个位置上分,不可能是转了一圈回到起点(因为他不如留在那个最大分数的点),所以我们只要沿着 pip_i 跑一圈遍历,选择最终得分最大的那个店就好了,另一个人同理。另外注意可能出现跑不满一圈的情况,那跑到第 kk 个点就退出循环。

代码

# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
int t, n, k, sb, ss, p[200005], now, x;
ll maxb, maxs, sum, a[200005];
int main () {
	ios::sync_with_stdio (0);
	cin.tie (0);
	cout.tie (0);
	cin >> t;
	while (t --) {
		cin >> n >> k >> sb >> ss;
		for (int i = 1; i <= n; ++ i)
			cin >> p[i];
		for (int i = 1; i <= n; ++ i)
			cin >> a[i];
		maxb = maxs = sum = 0, now = sb, x = k;
		do {
			maxb = max (maxb, x * a[now] + sum);
			sum += a[now];
			-- x;
			now = p[now];
		} while (~x && now != sb);
		sum = 0, now = ss, x = k;
		do {
			maxs = max (maxs, x * a[now] + sum);
			sum += a[now];
			-- x;
			now = p[now];
		} while (~x && now != ss);
		cout << (maxb > maxs ? "Bodya\n" : maxb < maxs ? "Sasha\n" : "Draw\n");
	}
	return 0;
}
posted @ 2024-05-04 17:11  Vitamin_B  阅读(8)  评论(0)    收藏  举报  来源