这道题感觉挺有意思的,我的想法比较傻,就是有下一步值大的话就走,不大的话就停留在当前位置,但很显然这种方法是错误的,因为下一步可能没有性价比,但下一步的下一步可能值会很大,所以思路一开始就假了,写完之后就一直卡着...看了题解之后才知道题解的贪心方法,感觉很巧妙,题解的贪心方法多了一步,就是记录往下走每一步的值,一次进行遍历处理,选出最大值,这道题需要注意的是,k <= 1e9 n <= 2e5,所以肯定不能遍历1e9次,需要对走的步数进行标记,防止循环走,否则光遍历就超时了...
#include<bits/stdc++.h>
#define ll long long
#define inf 1e9
using namespace std;
ll t, n, k, ps, pb;
vector<ll>p(1e6), a(1e6);
void slove(){
cin >> n >> k >> pb >> ps;
ll stepb = pb, steps = ps;
for(ll i = 1; i <= n; i++)
cin >> p[i];
for(ll i = 1; i <= n; i++)
cin >> a[i];
bool visb[200010] = {0}, viss[200010] = {0};
ll tool = 0, ansb = 0, anss = 0, kk = k;
while(!visb[stepb] && kk){
ansb = max(ansb, tool + a[stepb] * kk);
kk--;
tool += a[stepb];
visb[stepb] = 1;
stepb = p[stepb];
}
kk = k, tool = 0;
while(!viss[steps] && kk){
anss = max(anss, tool + a[steps] * kk);
kk--;
tool += a[steps];
viss[steps] = 1;
steps = p[steps];
}
if(ansb > anss){
cout << "Bodya" << endl;
}
if(ansb < anss){
cout << "Sasha" << endl;
}
if(ansb == anss){
cout << "Draw" << endl;
}
return ;
}
int main(){
cin >> t;
while(t--){
slove();
}
return 0;
}
之前查过vis[1e6] = {0}的时间复杂度好像是O(1),之前打的东北四省赛被卡常也是用这种方法过的,不知道对不对,有知道的大佬吗QWQ