/*
【归并排序】【洛谷】【P1309-瑞士轮】
归并排序 合并
sort时间复杂度为o(nlogn) 500ms 跑1e5 超时
因为数组是降序
每次对决 形成 胜者数组 败者数组 这两个数组也是降序
所以进行归并排序 时间复杂度为O(n) 可以跑
*/
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int maxn=2e5+10;
typedef struct node{
int idx;
int score;
int w;
};
node a[maxn],b[maxn],c[maxn];
int cot_i,cot_j;
bool cmp(node a,node b)
{
if(a.score!=b.score)
return a.score>b.score;
return a.idx<b.idx;
}
void merge()
{
int i=1,j=1,cot=1;
while(i<cot_i&&j<cot_j)
{
if(cmp(b[i],c[j]))
a[cot++]=b[i++];
else
a[cot++]=c[j++];
}
while(i<cot_i) a[cot++]=b[i++];
while(j<cot_j) a[cot++]=c[j++];
}
signed main()
{
int n,r,q;cin>>n>>r>>q;
n=n*2;
for(int i=1;i<=n;i++)
{
cin>>a[i].score;
a[i].idx=i;
}
for(int i=1;i<=n;i++) cin>>a[i].w;
sort(a+1,a+1+n,cmp);
while(r--)
{
cot_i=1; cot_j=1;
for(int i=1;i<=n/2;i++)
{
if(a[i*2-1].w>a[i*2].w)
{
a[i*2-1].score++;
b[cot_i++]=a[i*2-1];
c[cot_j++]=a[i*2];
}
else{
a[i*2].score++;
b[cot_i++]=a[i*2];
c[cot_j++]=a[i*2-1];
}
}
merge();//O(n) 复杂度
}
cout<<a[q].idx;
return 0;
}
【归并排序】【洛谷】【P1309-瑞士轮】
最新推荐文章于 2024-04-26 23:26:25 发布