题目链接
对赢一方和输一方分别建立数组,再归并排序
#include<cstdio>
#include<algorithm>
using namespace std;
#define _rep(i,a,b) for(int i=(a);i<=(b);i++)
const int N=2e5+10;
int n,R,q;
int tw,tl;
struct node{
int s,w,id;
bool operator <(const node&rhs)const{
return s>rhs.s||(s==rhs.s&&id<rhs.id);}
}man[N],win[N],lose[N];
inline void merge_sort(int l,int r)
{
int i=l,j=l,k=l;
while(i<=r&&j<=r)
if(win[i].s>lose[j].s||(win[i].s==lose[j].s&&win[i].id<lose[j].id))man[k++]=win[i++];
else man[k++]=lose[j++];
while(i<=r)man[k++]=win[i++];
while(j<=r)man[k++]=lose[j++];
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d%d",&n,&R,&q);
n*=2;
_rep(i,1,n)scanf("%d",&man[i].s),man[i].id=i;
_rep(i,1,n)scanf("%d",&man[i].w);
sort(man+1,man+n+1);
_rep(i,1,R)
{
tw=tl=0;
_rep(j,1,n/2)
if(man[j*2].w>man[j*2-1].w)win[++tw]=man[j*2],win[tw].s++,lose[++tl]=man[j*2-1];
else win[++tw]=man[j*2-1],win[tw].s++,lose[++tl]=man[j*2];
merge_sort(1,n/2);
}
printf("%d\n",man[q].id);
return 0;
}