codeforces C. Permutation Game(博弈)

题目链接

题目大意:有n个位置,每个位置有一个值a[i]。两个人轮流玩游戏。移动小球,小球假如当前在i位置,规则:找到一个位置j满足a[j]>a[i]且abs(j-i)%a[i]=0,这样就可以把球从i位置放到j位置。是不能移动小球的为loser。求当球初始位置在1~n时的输赢结果。

由于

a.     对于必胜态,一定有一个后继状态是必败的。

b.    对于必败态,所有后继都是必胜的。

没有后继为必败态

如3后继是1和2。其中1是必败态,2是必胜态。因为存在一个后继是必败态所以3为必胜态。

本题确定每个点的状态

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int num[maxn];
int f[maxn];
int q[maxn];
vector<int >vt[maxn];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)
        {
            for(int j=i+a[i];j<=n;j+=a[i])
            {
                if(a[j]>a[i])
                {
                    vt[j].push_back(i);///到j的点
                    num[i]++;///i能到达的地方个数
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=i-a[i];j>=1;j-=a[i])
            {
                if(a[j]>a[i])
                {
                    vt[j].push_back(i);///到j的点
                    num[i]++;///i能到达的地方de个数
                }
            }
        }
        memset(f,-1,sizeof(f));
        int r=1;int l=1;
        for(int i=1;i<=n;i++)
        {
            if(!num[i])
            {
                f[i]=0;
                q[r++]=i;
            }
        }
        while(l<r)
        {
            int u=q[l++];
            for(int i=0;i<vt[u].size();i++)
            {
                int v=vt[u][i];
                if(f[v]==-1)///v点还没确定,根据后继u确定v的必态
                {                   
                    if(f[u]==0) f[v]=1;
                    else f[v]=0;
                }
                else///v之前已经确定过状态,就是v后继出现必败态,v就是必胜态
                {
                    if(f[u]==0) f[v]=1;
                }
                num[v]--;
                if(!num[v]) q[r++]=v;
            }
        }
        for(int i=1;i<=n;i++)
        {
            if(f[i]) printf("A");
            else printf("B");
        }
        printf("\n");
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您提供的链接是Codeforces的一个问题,问题编号为104377。Codeforces是一个知名的在线编程竞赛平台,经常举办各种编程比赛和训练。Gym是Codeforces的一个扩展包,用于组织私人比赛和训练。您提供的链接指向了一个问题的页面,但具体的问题内容和描述无法通过链接获取。如果您有具体的问题或需要了解关于Codeforces Gym的更多信息,请提供更详细的信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [http://codeforces.com/gym/100623/attachments E题](https://blog.csdn.net/weixin_30820077/article/details/99723867)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [http://codeforces.com/gym/100623/attachments H题](https://blog.csdn.net/weixin_38166726/article/details/99723856)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [CodeforcesPP:Codeforces扩展包](https://download.csdn.net/download/weixin_42101164/18409501)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值