传送门:https://codeforces.com/contest/1490/problem/D
题意:
给一个长度为n的排列a,将排列a化成一颗二叉树,转化规则如下
- 在a中找到最大的数作为它的根节点
- 最大值左侧的子排列组构成左子树,子树构成规则相同
- 最大值右侧的子排列组构成右子树,子树构成规则相同
要求每个数在二叉树中对应节点的深度
思路:
好家伙,一道简单递归题,题意恁给看了半天没看懂,英语阅读能力有待提高。。。
递归
d
f
s
(
l
,
r
,
d
e
p
)
dfs(l,r, dep)
dfs(l,r,dep)
在区间
[
l
,
r
]
[l,r]
[l,r]中找
a
[
m
x
i
]
a[mxi]
a[mxi](mxi为最大值的索引值),然后递归
[
l
,
m
x
i
−
1
]
[l,mxi-1]
[l,mxi−1] 和
[
m
x
i
+
1
,
r
]
[mxi+1,r]
[mxi+1,r]
直到
l
<
r
l<r
l<r 结束递归
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e2+10;
int t,n,a[maxn],ans[maxn];
void dfs(int l,int r,int dep) {
if(r<l) return ;
int mxi=max_element(a+l,a+r+1)-a;
ans[mxi]=dep;
dfs(l,mxi-1,dep+1);
dfs(mxi+1,r,dep+1);
}
int main() {
cin>>t;
while(t--) {
memset(ans,0,sizeof ans);
cin>>n;
for(int i=1; i<=n; i++) cin>>a[i];
int mxi = max_element(a+1,a+1+n)-a;
dfs(1,mxi-1,1);
dfs(mxi+1,n,1);
for(int i=1; i<=n; i++) printf("%d ",ans[i]);
cout<<endl;
}
}