题意及思路

  • 题意:题意见上图,很明确,纯暴力可以做出来正确结果,但是会出现超时情况。
  • 思路:①😅纯纯的想法是,将这些数据封装成一个结构体,然后进行r次排序,比较,最后输出即可,😒不过这样太暴力,不可取。②😏改进的方法是,洛谷题解的好想法。就是每次pk完后,🙂分成两拨,一波是赢家,一波是输家。每一次比赛后合并。附上链接。


代码

#include<bits/stdc++.h>

using namespace std;

const int M = 2e5+5;
int n,r,q;

typedef struct A{
	int g,no,w; //得分、编号、实力值 
}Node;

int aL,wL,lL;
Node all[M],win[M],lose[M];

bool cmp(Node a,Node b){
	if(a.g!=b.g) return a.g > b.g;
	return a.no < b.no;
}

void merge(){
	int i=1,j=1;
	aL = 0;
	while(i<=wL && j<=lL){
		if(cmp(win[i],lose[j])) all[++aL] = win[i++];
		else all[++aL] = lose[j++];
	}
	while(i<=wL) all[++aL] = win[i++];
	while(j<=lL) all[++aL] = lose[j++];
}

int main()
{
	std::ios::sync_with_stdio(false);
    cin.tie(0);
	cin >> n >> r >> q;
	for(int i=1;i<=2*n;i++){
		cin >> all[i].g;
		all[i].no = i;
	}
	for(int i=1;i<=2*n;i++){
		cin >> all[i].w;
	}
	
	sort(all+1,all+1+2*n,cmp);
	while(r--){
		wL = lL = 0;
		for(int i=1;i<2*n;i+=2){
			if(all[i].w>all[i+1].w){
				all[i].g++;
				win[++wL] = all[i];
				lose[++lL] = all[i+1];
			}else{
				all[i+1].g++;
				win[++wL] = all[i+1];
				lose[++lL] = all[i];
			}
		}
		merge();
	}
	cout << all[q].no << endl;
    
	return 0;
}