洛谷1309:瑞士轮——题解

https://www.luogu.org/problem/P1309

我觉得我大概已经是个zz了,普及题都不会做还得看题解,难受。

$O(rnlogn)$肯定过不了(过了也没意义)

复杂度能降下来肯定序列是有规律可循的。

于是可以发现,胜者组和败者组他们的s永远都是单调减的。

然后就把两个有序的胜者组和败者组合并就行了,和归并排序差不多。

我的智商已如风中残烛。

#include<map> 
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=2e5+5;
inline int read(){
    int X=0,w=0;char ch=0;
    while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
struct people{
    int s,w,id;
}a[N],b[N],c[N];
int n,r,q;
bool cmp(people x,people y){
    if(x.s==y.s)return x.id<y.id;
    return x.s>y.s;
}
void msort(){
    for(int i=1,j=1;i<=2*n;i+=2,j++){
        if(a[i].w>a[i+1].w){
            b[j]=a[i];b[j].s++;
            c[j]=a[i+1];
        }else{
            b[j]=a[i+1];b[j].s++;
            c[j]=a[i];
        }
    }
    for(int i=1,j=1,k=1;i<=2*n;i++){
        if(j<=n&&(k>n||(b[j].s>c[k].s||(b[j].s==c[k].s&&b[j].id<c[k].id))))a[i]=b[j++];
        else a[i]=c[k++];
    }
}
int main(){
    n=read();r=read();q=read();
    for(int i=1;i<=2*n;i++){
        a[i].s=read();
        a[i].id=i;
    }
    for(int i=1;i<=2*n;i++)a[i].w=read();
    sort(a+1,a+2*n+1,cmp);
    for(int i=1;i<=r;i++){
        msort();
    }
    printf("%d",a[q].id);
    return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

 +本文作者:luyouqi233。               +

 +欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

posted @ 2019-08-06 21:37  luyouqi233  阅读(150)  评论(0编辑  收藏  举报