´
分析:
´
如果每次
n=100000
排序,共进行
r
轮
´
r
*
n
*
logn
=50
*
100000
*
20=10^8,
超时
´
第一次排序后
每次赢的和输的队伍分别有序,只需要o(n)的归并排序,时间复杂度变为5*10^6,不再超时。
#include<iostream>
#include<algorithm>//sort
using namespace std;
struct node{
int xh,fs,w;
}a[200002],b[200002],c[200002];
int n,r,q;
bool cmp(node x,node y)
{
if(x.fs!=y.fs) return x.fs>y.fs;
if(x.xh!=y.xh) return x.xh<y.xh;
}
int main()
{
int m,i,j;
cin>>n>>r>>q;
m=2*n;
for(i=1;i<=m;i++)
{ cin>>a[i].fs;
a[i].xh=i;
}
for(i=1;i<=m;i++)
cin>>a[i].w;
sort(a+1,a+m+1,cmp);
for(i=1;i<=r;i++)
{ int k=0,k1=1,k2=1;
for (j=1;j<m;j+=2)
{
if (a[j].w>a[j+1].w){ a[j].fs++; k++;b[k]=a[j];c[k]=a[j+1];}
else{ a[j+1].fs++;k++;b[k]=a[j+1];c[k]=a[j];}
}
for (j=1;j<=m;j++)
{
if (k1>n){a[j]=c[k2];k2++;continue;}
if (k2>n){a[j]=b[k1];k1++;continue;}
if ((b[k1].fs>c[k2].fs)||((b[k1].fs==c[k2].fs)&&b[k1].xh<c[k2].xh))
{a[j]=b[k1];k1++;}
else {a[j]=c[k2];k2++;}
}
}
cout<<a[q].xh<<endl;
return 0;
}