CF1033C Permutation Game

题目描述

输入输出样例

输入 #1

8
3 6 5 4 2 7 1 8

输出 #1

BAAAABAB

输入 #2

15
3 11 2 5 10 9 7 13 15 8 4 12 6 1 14

输出 #2

ABAAAABBBAABAAB

数据范围

1<=n<=1e5,1<=ai<=n

解题思路

暴力:略,复杂度玄学

正解:

大佬们都用反建图+拓扑排序

蒟蒻不才 只会dfs

AC Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
ll b[N], vis[N], dep[N],num[N], a[N],t, n, m,  k,x,y;
int dp[N][3];
char v[1005][1005];
int dfs(int x,int num) {
    if(dp[x][num%2]!=-1) return dp[x][num%2];
    else {
        dp[x][num%2]= (num%2==0) ? 0 : 1;
        int did=0;
        for(int i=1;; i++) {
            int l=x-i*a[x],r=x+i*a[x];
            if(l>=1&&a[l]>a[x]) {
                if(num%2==0) dp[x][num%2]=max(dp[x][num%2],dfs(l,num+1)),did=1;
                else dp[x][num%2]=min(dp[x][num%2],dfs(l,num+1)),did=1;
            }
            if(r<=n&&a[r]>a[x]) {
                if(num%2==0) dp[x][num%2]=max(dp[x][num%2],dfs(r,num+1)),did=1;
                else dp[x][num%2]=min(dp[x][num%2],dfs(r,num+1)),did=1;
            }
            if(l<1&&r>n) break;
        }
        if(!did) {
            return dp[x][num%2]=num%2;
        }
    }
    return dp[x][num%2];
}
int main() {
    cin>>n;
    for(int i=1; i<=n; i++) {
        cin>>a[i];
        dp[i][0]=dp[i][1]=-1;
    }
    for(int i=1; i<=n; i++) {
        if(dfs(i,0)) cout<<"A";
        else cout<<"B";
    }
}
/*
15
3 11 2 5 10 9 7 13 15 8 4 12 6 1 14
*/
原文地址:https://www.cnblogs.com/Larry-Zero/p/11763622.html