洛谷p1309
考虑到在一轮比赛后,胜者组的n人(均加一分)和败者组的n人(均不得分)的相对次序没有发生变化,故比赛每进行一轮,相当于对胜者组和败者组进行一次归并操作。其中,胜者组字在归并前需要先加上本轮获得的分值。
#include<bits/stdc++.h>
using namespace std;
int n,R,Q;
struct node{
int s,w,i;
}a[200005];
bool cmp(node x,node y){//按分值确定初始排序
if(x.s!=y.s) return x.s>y.s;
return x.i<y.i;
}
node winner[100005],loser[100005];
int main(){
cin>>n>>R>>Q;//2*n 选手
for(int i=1;i<=2*n;i++){
a[i].i=i;
cin>>a[i].s;
}
for(int i=1;i<=2*n;i++){
cin>>a[i].w;
}
sort(a+1,a+2*n+1,cmp);
while(R--){
for(int i=1;i<=n;i++){
if(a[2*i].w>a[2*i-1].w){//w两两不同
a[2*i].s++;//在进入归并序列前记得先加分s
winner[i]=a[2*i];
loser[i]=a[2*i-1];
}else{
a[2*i-1].s++;
winner[i]=a[2*i-1];
loser[i]=a[2*i];
}
}
int i1=1,i2=1;
for(int i=1;i<=2*n;i++){
if(i1>n){
a[i]=loser[i2];
i2++;
}else if(i2>n){
a[i]=winner[i1];
i1++;
}else if(winner[i1].s>loser[i2].s||(winner[i1].s==loser[i2].s&&winner[i1].i<loser[i2].i)){
a[i]=winner[i1];
i1++;
}else{
a[i]=loser[i2];
i2++;
}
}
}
cout<<a[Q].i;
}