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

浙公网安备 33010602011771号