60分求助!!! 被T了4个点 各位大佬帮忙看一下~
查看原帖
60分求助!!! 被T了4个点 各位大佬帮忙看一下~
782631
shengmin楼主2023/8/24 11:20

#include<bits/stdc++.h>
using namespace std;
const int maxn = 200005;
int N, R, Q, a[maxn][4], b[maxn][4]; //a[i][1]记录编号,a[i][2]记录实力值,a[i][3]记录分数
void merge(int p, int q, int r) { //p开始位置,q中间位置,r结束位置,二路归并
	int i, x, y;
	x = p;
	y = q + 1;
	i = p;
	while (x <= q && y <= r) {
		if (a[x][3] > a[y][3]) {
			b[i][1] = a[x][1];
			b[i][2] = a[x][2];
			b[i][3] = a[x][3];
			x++;
			i++;
		} else if (a[x][3] == a[y][3]) {
			if (a[x][1] < a[y][1]) {
				b[i][1] = a[x][1];
				b[i][2] = a[x][2];
				b[i][3] = a[x][3];
				x++;
				i++;
			} else {
				b[i][1] = a[y][1];
				b[i][2] = a[y][2];
				b[i][3] = a[y][3];
				y++;
				i++;
			}
		} else {
			b[i][1] = a[y][1];
			b[i][2] = a[y][2];
			b[i][3] = a[y][3];
			y++;
			i++;
		}
	}
	while (x <= q) {
		b[i][1] = a[x][1];
		b[i][2] = a[x][2];
		b[i][3] = a[x][3];
		i++;
		x++;
	}
	while (y <= r) {
		b[i][1] = a[y][1];
		b[i][2] = a[y][2];
		b[i][3] = a[y][3];
		i++;
		y++;
	}
	for (int k = p; k <= r; k++) {
		a[k][1] = b[k][1];
		a[k][2] = b[k][2];
		a[k][3] = b[k][3];
	}
}
void merge_sort(int l, int r) {
	if (l == r) return;
	int mid = (l + r) / 2;
	merge_sort(l, mid);
	merge_sort(mid + 1, r);
	merge(l, mid, r);
}
int main() {
	scanf("%d%d%d", &N, &R, &Q);
	for (int i = 1; i <= 2 * N; i++) { //输入编号和初始分数
		a[i][1] = i;
		scanf("%d", &a[i][3]);
	}
	for (int i = 1; i <= 2 * N; i++) { //输入实力值
		scanf("%d", &a[i][2]);
	}
	while (R) {
		memset(b, 0, sizeof(b));
		merge_sort(1, 2 * N);
//    printf("第%d轮比赛前\n",R);
//    for(int i=1;i<=2*N;i++) cout<<i<<" 编号:"<<a[i][1]<<" 得分:"<<a[i][3]<<endl;
		for (int i = 1; i <= 2 * N - 1; i += 2) {
			if (a[i][2] > a[i + 1][2]) a[i][3]++;
			else a[i + 1][3]++;
		}
		R--;
	}
	memset(b, 0, sizeof(b));
	merge_sort(1, 2 * N);
	cout << a[Q][1] << endl;
	return 0;
}
2023/8/24 11:20
加载中...