#include <stdio.h>
int n;
int Round;
int q;
struct E{
int score;
int strange;
int name;
} member1[2000005];
struct E Winner[2000005];
struct E Loser[2000005];
struct E member2[2000005];
int Sort(void);
void PK(int classes);
void Merge(struct E member1[], struct E member2[], int l, int mid, int r);
int main()
{
scanf("%d %d %d", &n, &Round, &q);
for (int i = 1; i <= 2 * n; i++){
scanf("%d", &member1[i].score);
member1[i].name = i;
}
for (int i = 1; i <= 2 * n; i++){
scanf("%d", &member1[i].strange);
}
if(Sort() == 1){ //若返回值为1,则最终排序结果保存在member1中,否则在member2中
for (int i = 1; i <= Round; i++){
PK(1);
}
printf("%d", member1[q].name);
}else{
for (int i = 1; i <= Round; i++){
PK(2);
}
printf("%d", member2[q].name);
}
}
int Sort(void)
{
int length = 1;
int temp = 1;
while(length < n * 2){
for (int i = 1; i + length - 1 <= n * 2; i += (length * 2)){
if(temp % 2){ //将member1归并到member2
Merge(member1, member2, i, i + length - 1, i + 2 * length - 1);
}else{ //将member2归并到member1
Merge(member2, member1, i, i + length - 1, i + 2 * length - 1);
}
}
temp++;
length *= 2;
}
if(temp % 2){
return 1;
}
return 2;
}
void Merge(struct E member1[], struct E member2[], int l, int mid, int r)
{
int i = l;
int j = mid + 1;
int k = l;
while(i <= mid && j <= r && j <= n * 2){
if(member1[i].score >= member1[j].score){
member2[k++] = member1[i];
i++;
}else{
member2[k++] = member1[j];
j++;
}
}
while(i <= mid){
member2[k++] = member1[i++];
}
while(j <= r && j <= n * 2){
member2[k++] = member1[j++];
}
}
void PK(int classes)
{
int cnt = 1;
if(classes == 1){
for (int i = 1; i <= n * 2 - 1; i += 2){
if(member1[i].strange > member1[i + 1].strange){
member1[i].score++;
Winner[cnt] = member1[i];
Loser[cnt] = member1[i + 1];
cnt++;
}else{
member1[i + 1].score++;
Winner[cnt] = member1[i + 1];
Loser[cnt] = member1[i];
cnt++;
}
}
int i = 1;
int j = 1;
cnt = 1;
while (i <= n && j <= n){
if(Winner[i].score > Loser[j].score){
member1[cnt++] = Winner[i++];
}
if(Winner[i].score < Loser[j].score){
member1[cnt++] = Loser[j++];
}
if(Winner[i].score == Loser[j].score){
if(Winner[i].name < Loser[j].name){
member1[cnt++] = Winner[i++];
}else{
member1[cnt++] = Loser[j++];
}
}
}
while(i <= n){
member1[cnt++] = Winner[i++];
}
while(j <= n){
member1[cnt++] = Loser[j++];
}
}else{
for (int i = 1; i <= n * 2 - 1; i += 2){
if(member2[i].strange > member2[i + 1].strange){
member2[i].score++;
Winner[cnt] = member2[i];
Loser[cnt] = member2[i + 1];
cnt++;
}else{
member2[i + 1].score++;
Winner[cnt] = member2[i + 1];
Loser[cnt] = member2[i];
cnt++;
}
}
int i = 1;
int j = 1;
cnt = 1;
while (i <= n && j <= n){
if(Winner[i].score > Loser[j].score){
member2[cnt++] = Winner[i++];
}
if(Winner[i].score < Loser[j].score){
member2[cnt++] = Loser[j++];
}
if(Winner[i].score == Loser[j].score){
if(Winner[i].name < Loser[j].name){
member2[cnt++] = Winner[i++];
}else{
member2[cnt++] = Loser[j++];
}
}
}
while(i <= n){
member2[cnt++] = Winner[i++];
}
while(j <= n){
member2[cnt++] = Loser[j++];
}
}
}
调了好久,感觉思路也正确,不知道错在哪里了。