题目链接:https://www.luogu.com.cn/problem/P4715
这是一道运用到二叉树的概念,每次找到两个子树的最大值,并赋给父节点,然后依次执行。
最后会得到树根,我们要的结果是比树根小一级,并且小于树根的那个数。
用数组表示的话,就是将数据分为前后两个等长的部分,并找到两个区间的最大值中间较小的那个值的地址。
下面是代码
注意这里用的位运算符,记得及时加上括号,避免不必要的失误。这是血的教训!!!
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
struct tree{
int val;
int num;
bool operator< (const tree &w) const{
return val > w.val;
}
}a[N];
int main(){
cin >> n;
for (int i = 1; i <= (1 << n); i ++ ){
int x; cin >> x;
a[i] = {x, i};
}
sort(a + 1, a + 1 + (1 << (n - 1)));
sort(a + 1 + (1 << (n - 1)), a + 1 + (1 << (n)));
cout << (a[1].val < a[(1 << (n - 1)) + 1].val ? a[1].num : a[(1 << (n - 1)) + 1].num) << endl;
return 0;
}