Permutation Game——CodeForces - 1968D

CodeForces - 1968D

这道题感觉挺有意思的,我的想法比较傻,就是有下一步值大的话就走,不大的话就停留在当前位置,但很显然这种方法是错误的,因为下一步可能没有性价比,但下一步的下一步可能值会很大,所以思路一开始就假了,写完之后就一直卡着...看了题解之后才知道题解的贪心方法,感觉很巧妙,题解的贪心方法多了一步,就是记录往下走每一步的值,一次进行遍历处理,选出最大值,这道题需要注意的是,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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值