思路:要用归并排序,不然会超时
#include<iostream>
#include<cstring>
#include<stack>
#include<cstdio>
#include<map>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
struct con
{
int abi;
int sco;
int id;
}ct[2000005],tem[2000005];
int cmp(con a,con b)
{
if(a.sco != b.sco)
return a.sco > b.sco;
else
return a.id < b.id;
}
int main()
{
int t,n,r,q;
cin >> t;
while(t--)
{
cin >> n >> r >> q;
for(int i = 0;i < n * 2;i++)
{
cin >> ct[i].sco;
ct[i].id = i + 1;
}
for(int i = 0;i < n * 2;i++)
cin >> ct[i].abi;
sort(ct,ct + n * 2,cmp);
for(int i = 0;i < r;i++)
{
int la = 0,ra = n;
for(int i = 0;i < 2 * n;i +=2)
{
if(ct[i].abi < ct[i + 1].abi)
{
ct[i + 1].sco++;
tem[la] = ct[i + 1],la++;
tem[ra] = ct[i],ra++;
}
else
{
ct[i].sco++;
tem[la] = ct[i],la++;
tem[ra] = ct[i + 1],ra++;
}
}
cout << la << " " << ra << "--" << endl;
for(int i = 0;i < 2 * n;i++)
cout << tem[i].sco << " ";
cout << endl;
int lb = 0,rb = n,cnt = 0;
while(lb < la && rb < ra)
{
if(tem[lb].sco == tem[rb].sco)
{
if(tem[lb].id < tem[rb].id)
ct[cnt] = tem[lb],cnt++,lb++;
else
ct[cnt] = tem[rb],cnt++,rb++;
}
else if(tem[lb].sco > tem[rb].sco)
ct[cnt] = tem[lb],cnt++,lb++;
else
ct[cnt] = tem[rb],cnt++,rb++;
}
while(lb < la)
ct[cnt] = tem[lb],cnt++,lb++;
while(rb < ra)
ct[cnt] = tem[rb],cnt++,rb++;
for(int i = 0;i < 2 * n;i++)
cout << ct[i].sco << " ";
cout << endl;
}
cout << ct[q - 1].id << endl;
}
return 0;
}