首先看题 这很显然是归并排序 的题目(doge) 归并排序是个什么玩意???
详见[大佬图解](https://www.cnblogs.com/chengxiao/p/6194356.html)
简单来说这个就是分治的思想,分成一个个小段排序最后再合起来以节省时间 前驱知识完毕
看题很自然是打sort
简单又方便 但是呢
该WA的WA
该TLE的TLE 反正没分
这就是因为瑞士轮,累死人(doge)
这是因为这道题的数据范围贼拉大。。。 而且并不是完全无序的 所以归并可以节省很多时间
最后奉上菜鸡代码
#include<bits/stdc++.h>
using namespace std;
int n,k,q,s;
struct dx{
int num;
int grade;
int shili;
};
dx pep[555555],win[555555],lose[555555];
int read()//快读
{
int x=0;
char s=getchar();
while(s>'9'||s<'0')
s=getchar();
while(s<='9'&&s>='0')
x=x*10+s-'0',s=getchar();
return x;
}
bool cmp(dx a1,dx a2)//自定义函数排序
{
if(a1.grade!=a2.grade)
return a1.grade>a2.grade;
else
return a1.num<a2.num;
}
void work()
{
int lb=0,lc=0,la;
for(int i=1;i<n*2;i+=2)
{
if(pep[i].shili>pep[i+1].shili)
{
pep[i].grade++;
win[++lb]=pep[i];
lose[++lc]=pep[i+1];
}
else
{
pep[i+1].grade++;
win[++lb]=pep[i+1];
lose[++lc]=pep[i];
}
}
lb=1,lc=1,la=1;
while(lb<=n&&lc<=n)
{
if(cmp(win[lb],lose[lc]))
pep[la++]=win[lb++];
else
pep[la++]=lose[lc++];
}
while(lb<=n)
pep[la++]=win[lb++];
while(lc<=n)
pep[la++]=lose[lc++];
}
int main()
{
n=read(),k=read(),q=read();
for(int i=1;i<=n*2;i++)
pep[i].num=i,pep[i].grade=read();
for(int i=1;i<=n*2;i++)
pep[i].shili=read();
sort(pep+1,pep+n*2+1,cmp);
for(int i=1;i<=k;i++)
work();
printf("%d",pep[q].num);
return 0;
}
备注:(这玩意我也没太懂看题解的思路水的有大佬明白的评论讲讲)
共 3 条回复
dalao%%%
龘鏰啊