⼀年⼀度的校园歌⼿⼤赛开始了,今年⼀共有n个选⼿参与了⽐赛,分别编号为1到n ,每 个⼈的唱功可以⽤数字ai来量化,保证a1到an互不相同。
今年赛事委员会决定让⽐赛变得更刺激⼀点,于是采⽤了以下的赛制:
编号为2d+1的选⼿和编号为2d+2的选⼿会通过对唱来PK(d 为整数),唱功更 ⾼的选⼿(即ai更⼤的选⼿)获胜,晋级下⼀轮。如果n为奇数,则编号为n的选⼿ 轮空,直接晋级。这⼀轮所有淘汰的选⼿,其最终名次就是第⌈2n+1⌉名。
所有晋级的选⼿重新编号1到⌈2n⌉,继续下⼀轮。
直到剩下⼀个选⼿,Ta就是歌⼿⼤赛的冠军,其名次也就是第1 名。
唱功不错的⼩ B 却惨遭⼀轮游,原因是第⼀轮遇到的对⼿最后获得了冠军。 所以他为了向赛事委员会说明这个⽐赛规则的不合理性,他想对于每⼀个i,求出如果初始编 号为i的选⼿能在第⼀次被淘汰的那⼀场⽐赛获胜晋级,他最终能得到什么名次。
第 ⾏包含⼀个正整数n,表⽰选⼿数量。
第 ⾏包含n个正整数a1,a2,...,an 表⽰每⼀位选⼿的唱功。
包含⼀⾏n个整数,含义如题。
10
3 9 6 12 15 24 30 18 27 21
4 3 4 2 4 2 1 4 1 2
样例解释
第⼀轮选⼿[3,9,6,12,15,24,30,18,27,21]
第⼆轮[9,12,24,30,27]
第三轮[12,30,27]
第四轮[30,27]
第五轮[30]
对于选⼿2,他第⼀次被淘汰在第⼆轮,若获胜,则第三轮选⼿是[9,30,27],所以选⼿2 最后的名次变成了3。
数据范围 对于所有数据 n≤5×105,ai≤109,并且互不相同。
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n;
int a[N],b[N];
map<int,int> mp,mp1;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
mp[a[i]]=i;
}
for(int i=1;i<=n;i++) b[i]=a[i];
for(int i=1;i<=n;i++)
{
int num=n;
bool pd=false;
for(int j=1;j<=n;j++)
{
a[j]=b[j];
}
bool pd1=false;
// cout<<a[i]<<"---\n";
while(num>1)
{
int cnt=0;
pd1=false;
for(int j=1;j<=num;j+=2)
{
if(a[j]==b[i]||a[j+1]==b[i])
{
// cout<<pd<<"\n";
if(b[i]>a[j]||b[i]>a[j+1])
{
a[++cnt]=b[i];
}
else if(!pd)
{
pd=true;
a[++cnt]=a[j];
a[++cnt]=a[j+1];
}
else
{
pd1=true;
cout<<num/2+1<<" ";
break;
}
}
else
{
a[++cnt]=max(a[j],a[j+1]);
}
}
// cout<<"\n";
// for(int j=1;j<=cnt;j++) cout<<a[j]<<" ";
// cout<<"\n";
if(pd1)
{
break;
}
if(num%2==1) a[++cnt]=a[num];
num=cnt;
}
if(!pd1) cout<<1<<" ";
}
}