瑞士轮(归并
见注释嗷
int fen[200010],x[200020],sh[200020];//fen存分数,x存序号,sh存实力
int w[100010],l[100010];//w存这一轮胜利的序号,l存这一轮输的序号
bool cmp(int a,int b)
{
if(fen[a]==fen[b])
return a<b;
else
return fen[a]>fen[b];
}
int main()
{
int n,r,q,tw,tl;//tw指向胜利,tl指向输的
cin>>n>>r>>q;
n*=2;
for(int i=1;i<=n;i++)
{
cin>>fen[i];
x[i]=i;
}//初始分数,序号
for(int i=1;i<=n;i++)
{
cin>>sh[i];
}//存实力
sort(x+1,x+1+n,cmp);//按照初始分数对序号排序
for(int i=0;i<r;i++)
{
tw=tl=1;
for(int j=1;j<n;j+=2)
{
if(sh[x[j]]>sh[x[j+1]])
{
fen[x[j]]++;
w[tw++]=x[j];
l[tl++]=x[j+1];
}
else
{
fen[x[j+1]]++;
w[tw++]=x[j+1];
l[tl++]=x[j];
}
}//因为赢的输的内部顺序固定不变,用并归排序,先把赢的序号和输的序号按照分数高低放到俩数组里
tw=1,tl=1;
int co=1;
while(tw<=n/2&&tl<=n/2)
{
if(cmp(w[tw],l[tl]))
x[co++]=w[tw++];
else
x[co++]=l[tl++];
}
while(tw<=n/2)
{
x[co++]=w[tw++];
}
while(tl<=n/2)
{
x[co++]=l[tl++];
}//并归排序
}
cout<<x[q]<<endl;
return 0;
}