码迷,mamicode.com
首页 > 其他好文 > 详细

Problem - 1033C - Codeforces

时间:2019-01-16 20:45:50      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:nlogn   分享   div   bsp   height   class   not   知识   tle   

一开始觉得自己的答案会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

标签:nlogn   分享   div   bsp   height   class   not   知识   tle   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!