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) 收藏 举报
浙公网安备 33010602011771号