为什么这只有60??求大神指点

P4715 【深基16.例1】淘汰赛

@[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


|