瑞士轮,累死人

Mrnobody 2022-03-14 19:14:52 2022-03-14 19:16:28

首先看 这很显然是归并排序 的题目(doge) 归并排序是个什么玩意???

详见[大佬图解](https://www.cnblogs.com/chengxiao/p/6194356.html)

简单来说这个就是分治的思想,分成一个个小段排序最后再合起来以节省时间 前驱知识完毕

看题很自然是打sort

简单又方便 但是呢

WAWA

TLETLE 反正没分

这就是因为瑞士轮,累死人(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 条回复

Laffey

{dalao}^{{dalao}^{dalao}_{dalao}}_{{dalao}^{dalao}_{dalao}}

Laffey

dalao%%%

2020we

龘鏰啊