@[leiyuhan](/user/1319338)
我用的队列,感觉用队列好写点
```
#include <bits/stdc++.h>
using namespace std;
queue<int>q;
int m[10000005];
int x,a,da;
int main(){
cin>>x;
for(int i=1;i<=pow(2,x);i++){
cin>>a;
m[i]=a;
q.push(a);
}
while(1){
if(q.size()==2){
break;
}
int v=q.front();
q.pop();
int w=q.front();
q.pop();
//cout<<v<<"vs"<<w<<" "<<max(v,w)<<"win!\n";
q.push(max(v,w));
//cout<<q.size()<<endl;
}
int l1=q.front();
q.pop();
int l2=q.front();
q.pop();
da=min(l1,l2);
for(int i=1;i<=pow(2,x);i++){
if(m[i]==da){
cout<<i;
return 0;
}
}
return 0;
}
```
by jury01 @ 2024-08-27 15:49:50
![](https://cdn.luogu.com.cn/upload/image_hosting/poj5si4v.png?x-oss-process=image/resize,m_lfit,h_170,w_225)
可以考虑用树形存储
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int tr[N],deal;
int main(){
int n;
cin>>n;
for(int i=pow(2,n);i<pow(2,n)+pow(2,n);i++){
cin>>tr[i];
}
for(int i=1;i<=n;i++){
for(int j=pow(2,n-i);j<pow(2,n-i)+pow(2,n-i);j++){
tr[j]=max(tr[j*2],tr[j*2+1]);
}
// cout<<endl;
}
deal=min(tr[2],tr[3]);
// cout<<deal;
// for(int i=4;i<=7;i++) cout<<tr[i]<<" ";
int j=0;
for(int i=pow(2,n);i<pow(2,n)+pow(2,n);i++){
j++;
if(tr[i]==deal) {
cout<<j;
break;
}
}
}
```
by _std_O2 @ 2024-08-27 15:52:57
@[_std_O2](/user/1273684)
我是直接用下一层覆盖了上一层的值
覆盖到最后前俩个就是冠亚军
如何比较输出ID
by leiyuhan @ 2024-08-27 16:04:11
@[leiyuhan](/user/1319338) 你应该用两倍的存储空间去维护它,否则有可能造成数据的混乱。
by _std_O2 @ 2024-08-27 16:11:50
@[_std_O2](/user/1273684) 我试试
by leiyuhan @ 2024-08-29 17:22:01