直接用sort函数会超时
从开始到结尾 每局获胜的人 的顺序是排好的
然后就可以用归并(〃‘▽’〃)
初始分数已知,然后降序排列,两两比赛,力量值大的获胜,每个人的力量值都不同。比赛r轮,找出排名q的编号
#include<stdio.h>
#include<algorithm>
using namespace std;
struct s{
int w;
int grade;
int num;
};
int n,q,r;
struct s p[200005],a[100001],b[100001];
int cmp(struct s x,struct s y)
{
if(x.grade==y.grade)
return x.num<y.num;
return x.grade>y.grade;
}
void merge()
{
int i=0,j=0,k=0;
while(i<n&&j<n)
{
if(a[i].grade>b[j].grade||(a[i].grade==b[j].grade&&a[i].num<b[j].num))
{
p[k].grade=a[i].grade;
p[k].num=a[i].num;
p[k].w=a[i].w;
k++;i++;
}
else
{
p[k].grade=b[j].grade;
p[k].num=b[j].num;
p[k].w=b[j].w;
k++;j++;
}
}
while(i<n)
{
p[k].grade=a[i].grade;
p[k].num=a[i].num;
p[k].w=a[i].w;
k++;i++;
}
while(j<n)
{
p[k].grade=b[j].grade;
p[k].num=b[j].num;
p[k].w=b[j].w;
k++;j++;
}
}
int main()
{
int i,j;
scanf("%d %d %d",&n,&r,&q);
for(i=0;i<2*n;i++)
scanf("%d",&p[i].grade);
for(i=0;i<2*n;i++)
{
scanf("%d",&p[i].w);
p[i].num=i+1;
}
sort(p,p+2*n,cmp);
for(i=0;i<r;i++)
{
int tt=0;
for(j=1;j<2*n;j+=2)
{
if(p[j].w>p[j-1].w)
{
a[tt].grade=p[j].grade+1;
a[tt].num=p[j].num;
a[tt].w=p[j].w;
b[tt].grade=p[j-1].grade;
b[tt].num=p[j-1].num;
b[tt].w=p[j-1].w;
tt++;
}
else
{
a[tt].grade=p[j-1].grade+1;
a[tt].num=p[j-1].num;
a[tt].w=p[j-1].w;
b[tt].grade=p[j].grade;
b[tt].num=p[j].num;
b[tt].w=p[j].w;
tt++;
}
}
merge();
}
printf("%d",p[q-1].num);
return 0;
}