首页 > 其他 > 详细

Problem - 1033C - Codeforces

时间:2019-01-16 20:27:25      阅读:159      评论:0      收藏:0      [点我收藏+]

一开始觉得自己的答案会TLE,但其实因为下面这个公式是O(nlogn)的,不是O(n2),所以这样做是可行的。学到了新的知识。

技术分享图片

#include<bits/stdc++.h>
using namespace std;
#define ll long long

int res[100005];
int p[100005];
int a[100005];

int n;
void solve(int num,int c){
    for(int k=1;p[num]+k*num<=n;k++){
        if(a[p[num]+k*num]>num){
            if(res[a[p[num]+k*num]]==0){
                //存在一种转移到先手赢的情况?不应该让对方赢
                //存在一种转移到先手输的情况,转移过去自己就赢了
                //printf("%d can move to %d\n",num,a[p[num]+k*num]);
                res[num]=1;
                return;
            }
        }
    }
    for(int k=1;p[num]-k*num>=1;k++){
        if(a[p[num]-k*num]>num){
            if(res[a[p[num]-k*num]]==0){
                //存在一种转移到先手赢的情况?不应该让对方赢
                //存在一种转移到先手输的情况,转移过去自己就赢了
                //printf("%d can move to %d\n",num,a[p[num]-k*num]);
                res[num]=1;
                return;
            }
        }
    }
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        p[a[i]]=i;
    }

    res[n]=0;
    //先手赢=false
    for(int i=n-1;i>=1;i--){
        res[i]=0;
        //一开始假设没办法转移,先手赢=false
        solve(i,A);
        if(res[i]==0){
            //printf("%d cannot move\n",i);
        }
    }

    for(int i=1;i<=n;i++){
        int t=a[i];
        if(res[t]==1){
            printf("A");
        }
        else{
            printf("B");
        }
    }

    printf("\n");
}

 

Problem - 1033C - Codeforces

原文:https://www.cnblogs.com/Yinku/p/10279024.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!