HElP!!!
查看原帖
HElP!!!
148673
OneFan楼主2020/5/10 12:07

归并排序的题

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;
}
2020/5/10 12:07
加载中...