#P1878. 淘汰赛2.填空题

淘汰赛2.填空题

题目描述

有 k 个国家参加世界杯决赛圈且进入淘汰赛环节。已经知道各个国家的能力值,且都不相等。能力值高的国家和能力值低的国家踢比赛时高者获胜。1 号国家和 2 号国家踢一场比赛,胜者晋级。3 号国家和 4 号国家也踢一场,胜者晋级……晋级后的国家用相同的方法继续完成赛程,直到决出冠军。给出各个国家的能力值,请问亚军是哪个国家?

输入格式

第一行一个整数 kk,表示一共 kk 个国家参赛。(1k105 1 \leq k \leq 10^5

第二行 kk 个整数,第 ii 个整数表示编号为 ii 的国家的能力值(1i2n1\leq i \leq 2^n)。

数据保证不存在平局。

输出格式

仅一个整数,表示亚军国家的编号。

8
4 2 3 1 10 5 9 7
1

提示

这是一棵完全二叉树,只有底下的一层是没有填满,而且可以刻意让没填满的节点出现在右侧。

完成程序

#include<bits/stdc++.h>
using namespace std;

const int Maxn = 400001;
// 这是一个重要的知识点,完全二叉树,最后一层是 n,整棵树节点数接近 4*n

struct Team {
	int id, ability;

	// 重载 < 运算符
	bool operator < (const Team &other) const{
		return __填空(1)__;
	}
}x[Maxn];

int main() {
	int k;
	scanf("%d", &k);

	int level=0;

	while(__填空(2)__) level ++;
	// 这棵树有 level 层
	//前面的 level-1 层有 2^level-1 个节点,第 level 层的开始下标是 2^level
	int j=__填空(3)__; // j 是底层叶子节点的下标
	for(int i=1; __填空(4)__;i++,j++){
		cin>>x[j].ability;
		x[j].id = i;
	}
	j--;

	for(int i=j;i>0;i-=2){
		x[__填空(5)__] = x[i]<x[i-1] ?  __填空(6)__; // 三目运算,填写后两目
	}

	printf("%d", x[2]<x[3]? __填空(7)__ : __填空(8)__);

	return 0;
}

填空(1):{{ input(1) }}

填空(2):{{ input(2) }}

填空(3):{{ input(3) }}

填空(4):{{ input(4) }}

填空(5):{{ input(5) }}

填空(6):{{ input(6) }}

填空(7):{{ input(7) }}

填空(8):{{ input(8) }}