Codeforces Round #702 (Div. 3)D. Permutation Transformation

D. Permutation Transformation

题目

Codeforces Round #702 (Div. 3)D. Permutation Transformation_第1张图片

输入样例

3
5
3 5 2 1 4
1
1
4
4 3 1 2

输出样例

1 0 2 3 1 
0 
0 1 3 2 

解题思路

递归,当每次找到区间里的最大值时,以这个最大值将区间再分左边区间和右边区间,递归继续查找最大值,在每次重新分区间时,注意已经找到最大值的下标,不能再放进去,每递归一层那么深度就加一,而存储数组可以用结构体,x存读入数的大小,y存深度。

#include 
#define ll long long
using namespace std;
#define sl(n) scanf("%lld",&n)
#define pl(n) printf("%lld",n)
#define pE printf("\n")
#define pb push_back
#define pre(n) for(i=0;i
struct node{
     
 ll x,y;
}a[105];
void doo( ll l,ll r,ll num){
     
	ll mx=l,i;
	if(l>r)return ;
	for(i=l;i<=r;i++)if(a[mx].x<a[i].x)mx=i;
	a[mx].y=num;
	doo(l,mx-1,num+1),doo(mx+1,r,num+1);
} 
int main(){
     
	ll t,l,r,n,i,j;
	sl(t);
	while(t--){
     
		sl(n);
		pre(n)sl(a[i].x),a[i].y=0;
		doo(0,n-1,0);
		pre(n){
     
		pl(a[i].y);
		printf(" ");
	}
	pE;
	}
	return 0;
}

你可能感兴趣的:(递归,算法)