AcWing 尼古P4725. 二叉树
原题链接
简单
作者:
未名湖畔的梦
,
2021-03-05 16:26:48
,
所有人可见
,
阅读 240
- 二叉树(from洛谷)
你洛谷的题解放这干啥,我也不知道hhc,可能最近不怎么用luogu了
说正事:
- 本题目可以画个赛程图,很明显是个二叉树嘛!
- 所以我用二叉树来写的(其实好像也可以不需要,排序之后处理一下最大的几个数就可以,但是为了学习数据结构还是写二叉树吧)。
-
注意: 第二大的数不一定是亚军(刚开始以为不用用二叉树的我就被坑了),为什么???因为第二大的数可能在比赛的时候被第一给干掉了,而更小的数反而进决赛了
#include <iostream>
#include <cstdio>
#define N (1 << n)
using namespace std;
const int z = 1 << 8;
int val[z], win[z], n;
//val --> 对应国家的nb程度(hhc) win --> 胜利者的序号 n --> 参赛总国家数量
void dfs(int x){
if(x >= N) return ; //递归终止条件
int next = x << 1; //树的下一层
dfs(next); //递归下一层左节点
dfs(next + 1); //递归下一层右节点
int l_val = val[next], r_val = val[next + 1];//记录下一层的国家nb程度
if(l_val > r_val){ //左边的国家胜利
val[x] = l_val; //那么上一层(即胜利)的国家就是左边的国家
win[x] = win[next]; //记录nb程度和编号
}
else { //同理记录如果是右节点胜利的国家nb程度和编号
val[x] = r_val;
win[x] = win[next + 1];
}
}
int main(){
scanf("%d",&n);
for(int i = 0; i < N; i++){ //从(递归)最底层读入
scanf("%d",&val[i + N]); //对应国家的nb程度
win[i + N] = i + 1; //胜利者的编号(因为 i 从 0 开始但是国家编号是从 1 开始)
}
dfs(1); //搜索
printf("%d\n",(val[2] > val[3] ? win[3] : win[2]));//最后一层(即争夺冠军的比赛),选出亚军
return 0;
}