归并排序的题
P1309 瑞士轮
#include<bits/stdc++.h>
using namespace std;
const int maxn= 2e5+10;
int n,r,q;
int w[maxn];
struct ren{
int ss,num;
}a[maxn];
ren A[maxn],B[maxn];
bool cmp(ren a,ren b)
{
if(a.ss==b.ss) return a.num<b.num;
return a.ss>b.ss;
}
void msort()
{
int i=1,j=1,k=1;
while(i<=n&&j<=n)
{
if( A[i].ss>B[j].ss || (A[i].ss==B[j].ss&&A[i].num<B[j].num) )
{
a[k].ss=A[i].ss;
a[k].num=A[i].num;
k++;
i++;
}
else
{
a[k].ss=B[j].ss;
a[k].num=B[j].num;
k++;
j++;
}
while(i<=n)
{
a[k].ss=A[i].ss;
a[k].num=A[i].num;
k++;
i++;
}
while(j<=n)
{
a[k].ss=B[j].ss;
a[k].num=B[j].num;
k++;
j++;
}
}
}
int main()
{
cin>>n>>r>>q;
for(int i=1;i<=n*2;i++)
{
cin>>a[i].ss;
a[i].num=i;
}
for(int i=1;i<=n*2;i++)
cin>>w[i];
sort(a+1,a+n*2+1,cmp);
for(int k=1;k<=r;k++)
{
int tmp=1;
for(int i=1;i<n*2;i+=2)
{
if(w[a[i].num]>w[a[i+1].num])
{
A[tmp].ss=a[i].ss+1;
A[tmp].num=a[i].num;
B[tmp].ss=a[i+1].ss;
B[tmp].num=a[i+1].num;
tmp++;
}
else
{
A[tmp].ss=a[i+1].ss+1;
A[tmp].num=a[i+1].num;
B[tmp].ss=a[i].ss;
B[tmp].num=a[i].num;
tmp++;
}
}
msort();
}
cout<<a[q].num<<endl;
return 0;
}