输入 #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
#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