L2-3 锦标赛

先画图理解
具体就是先存入每个左右子树的lose,然后存入根的lose和win
然后往下建树,左右的win也可以交换
可以学习这样的完全二叉树存储结构

#include <bits/stdc++.h>
#define int long long 
using namespace std;
using pii=pair<int,int>;
int n;

struct node{
	int w;
	int l;
}tree[1<<19];//结构体一维数组建立完全二叉树

bool create(int x){
	
	if(x>=(1<<n)) return 1; 
	else if(tree[x].l>tree[x].w) return 0;//如果某一层的lose 与win不符合就退出循环
	
	tree[x*2].w=tree[x].w;//画图 根的win赋给左子树 lose赋给右子树
	tree[x*2+1].w=tree[x].l;
	
	if(create(x*2)&&create(x*2+1)) return 1; 
	
	swap(tree[x*2].w,tree[x*2+1].w);//可以再次交换 左右子树的win 检查是否符合
	if(create(x*2)&&create(x*2+1)) return 1;
	return 0;
	
}




void solve(){
	
	cin>>n;
	for(int i=n;i>=1;i--)
	{
		for(int j=1<<(i-1);j<(1<<i);j++)  
		{
			cin>>tree[j].l;
		}
	}
	
	cin>>tree[1].w;
	
	if(create(1)){
		int k=1<< (n-1);
		
		cout<< tree[k].l<<" "<<tree[ k ].w;
		for(int i= (1<<(n-1) )+1 ;i< 1<<n; i++)
		{
			cout<<" "<<tree[i].l<<" "<<tree[i].w;
		}
	}else {
		cout<<"No Solution";
	}
	
}

signed main()
{
	int t=1;
	//cin>>t;
	while(t--) solve();
	
	return 0;
	
}

posted on 2025-03-12 23:03  swj2529411658  阅读(59)  评论(0)    收藏  举报

导航