根据队列知识,和巧用题目信息,代码都很简单哈哈哈,因为我会的不多
cpp
#include<iostream>
#include<queue>
#include<map>
using namespace std;
#define int long long
int n,num=1;
signed main(){
cin>>n;
queue<int>q;map<int,int>mp;
for(int i=1;i<=n;i++){
num=num*2;
}
for(int i=1;i<=num;i++){
int x ;cin>>x;
q.push(x);
mp[x]=i;
}
while(q.size()>=2){
if(q.size()==2){
int a,b;
a=q.front();q.pop();
b=q.front();q.pop();
if(a>b)cout<<mp[b];
else cout<<mp[a];
return 0;
}
else {
int a,b;
a=q.front();q.pop();
b=q.front();q.pop();
if(a>b)q.push(a);
else q.push(b);
}
}
return 0;
}
但是又看到大佬的两个代码感觉又学到了
建立线段树模板
cpp
ll arr[100010]={0},tree[500050]={0}; //arr为存储数据的数组,tree是存线段树的数组
void build(int node,int start,int end){ //建树函数,参数是根节点和左右区间
if(start==end){ //如果两边相等
tree[node]=arr[start]; //填的就是数组里的初始值
return; //递归边界
}
int leftnode=node*2; //算出左右节点(完全二叉树的性质)
int rightnode=node*2+1;
int mid=(start+end)/2; //把数组从中间劈成两半
build(leftnode,start,mid); //左边右边分开建树
build(rightnode,mid+1,end);
tree[node]=tree[leftnode]+tree[rightnode]; //根节点的值=左根+右根
}
ac代码
cpp
#include<iostream>
#include<cstring>
#include<algorithm> //比赛的时候闲的没事打了一堆头文件
#include<cmath>
#include<iomanip>
using namespace std;
struct jiegouti{ //真·结构体
int power,id; //power------能力值,id------国家序号
};
jiegouti maxt(jiegouti a,jiegouti b){ //返回两个结构体里能力值更大的那个
return a.power>b.power?a:b;
}
jiegouti mint(jiegouti a,jiegouti b){ //返回两个结构体里能力值更大的那个
return a.power<b.power?a:b;
}
jiegouti a[150],tree[600]; //a------数据,tree------线段树(一般为了防爆,线段树都是开数组的4倍空间)
void build(int node,int start,int end){ //建树函数
if(start==end){ //叶节点,返回
tree[node]=a[start];
return;
}
int lnode=node*2; //左右子树、中点
int rnode=node*2+1;
int mid=(start+end)/2;
build(lnode,start,mid); //两边递归建树
build(rnode,mid+1,end);
tree[node]=maxt(tree[lnode],tree[rnode]) //父节点是左右子节点里更大的;
}
int main(){
int n; //输入
cin>>n;
for(int i=1;i<=(1<<n);i++){ //1<<n就是2的n次方啦!(这样比pow函数更快哦!)
cin>>a[i].power; //输入,赋值,很简单
a[i].id=i;
}
build(1,1,(1<<n)); //建树(根节点是1,整棵树从1到2的n次方)
cout<<mint(tree[2],tree[3]).id; //从tree[2],tree[3]里找个小的就是亚军,输出它的序号
return 0;
}
和我差不多的思路的大佬ac代码
但是多了一个make_pair(int x,int b);前面还有一个queue<>,很值得学习一下,捆绑诱惑
cpp
#include<iostream>
#include<queue>
#include<map>
using namespace std;
int main(){
int n;
queue<pair<int,int> > q; //pair是stl中的数据结构,这里用first表示国家号,second表示国家实力
cin>>n;
n=1<<n; //位运算,等价与n=pow(2,n)(位运算更快)
for(int i=1;i<=n;i++){
int x;
cin>>x;
q.push(make_pair(i,x)); //make_pair(i,x)就是建立一个first为i,second为x的pair
}
while(q.size()>2){ //循环将比赛进行至只剩前两名(q.size()为2是时要跳出循环单独判断亚军)
pair<int,int> x,y;
x=q.front();
q.pop();
y=q.front();
q.pop();
if(x.second>y.second){ //从队头取出两个队,进行比较后将较强的队压入队尾
q.push(x);
}else{
q.push(y);
}
}
pair<int,int> x,y;
x=q.front();
q.pop();
y=q.front();
q.pop();
if(x.second>y.second){ //较弱的那队时亚军,将其国家号输出
cout<<y.first<<endl;
}else{
cout<<x.first<<endl;
}
return 0;
}