#include <bits/stdc++.h>
using namespace std;
int n, r, q;
int a[200100], win[200100], lose[200100];
int s[200100], w[200100];
bool cmp(int x, int y)
{
if(s[x] == s[y])
return x < y;
return s[x] > s[y];
}
void merge()
{
int i,j;
i = j = 1, a[0] = 0;
while(i <= win[0] && j <= lose[0])
{
if(cmp(win[i], lose[j]))
{
a[0] ++;
a[a[0]] = win[i];
i ++;
}
else
{
a[0] ++;
a[a[0]] = lose[j];
j ++;
}
}
while(i <= win[0])
{
a[0] ++;
a[a[0]] = win[i];
i ++;
}
while(j <= lose[0])
{
a[0] ++;
a[a[0]] = lose[j];
j ++;
}
}
int main()
{
int i, j;
cin >> n >> r >> q;
n *= 2;
for(i = 1; i <= n; i ++)
a[i] = i;
for(i = 1; i <= n; i ++)
scanf("%d", &s[i]);
for(i = 1; i <= n; i ++)
scanf("%d", &w[i]);
sort(a + 1, a + n + 1, cmp);
for(i = 1; i <= r; i ++)
{
win[0] = lose[0] = 0;
for(j = 1; j <= n; j += 2)
{
if(w[a[j]] > w[a[j + 1]])
{
s[a[j]] ++;
win[0] ++;
lose[0] ++;
win[win[0]] = a[j];
lose[lose[0]] = a[j + 1];
}
else
{
s[a[j + 1]] ++;
win[0] ++;
lose[0] ++;
win[win[0]] = a[j + 1];
lose[lose[0]] = a[j];
}
}
if(w[a[j]] > w[a[j + 1]])
{
s[a[j]] ++;
win[0] ++;
lose[0] ++;
win[win[0]] = a[j];
lose[lose[0]] = a[j + 1];
}
else
{
s[a[j + 1]] ++;
win[++ win[0]] = a[j + 1];
lose[++ lose[0]] = a[j];
}
merge();
}
cout << a[q];
return 0;
}
一个朴素的归并。。。
但还是错了。。。