codevs1132 瑞士轮 归并排序

´ 分析:
´ 如果每次 n=100000 排序,共进行 r
´ r * n * logn =50 * 100000 * 20=10^8, 超时
´ 第一次排序后

每次赢的和输的队伍分别有序,只需要o(n)的归并排序,时间复杂度变为5*10^6,不再超时。

#include<iostream>

#include<algorithm>//sort
using namespace std;
struct node{
       int xh,fs,w;
       }a[200002],b[200002],c[200002];
int n,r,q;
bool cmp(node x,node y)
{
  
  if(x.fs!=y.fs) return x.fs>y.fs;
  if(x.xh!=y.xh) return x.xh<y.xh;
}

int main()
{
    int m,i,j;
    cin>>n>>r>>q;
    m=2*n;
    for(i=1;i<=m;i++) 
    { cin>>a[i].fs;
      a[i].xh=i;
    }
    for(i=1;i<=m;i++) 
     cin>>a[i].w;
    sort(a+1,a+m+1,cmp);
    
    for(i=1;i<=r;i++)
    {  int k=0,k1=1,k2=1;    
       for (j=1;j<m;j+=2)
       {
           if (a[j].w>a[j+1].w){ a[j].fs++; k++;b[k]=a[j];c[k]=a[j+1];}
             else{ a[j+1].fs++;k++;b[k]=a[j+1];c[k]=a[j];}
       }
       
       for (j=1;j<=m;j++)
       {
         if (k1>n){a[j]=c[k2];k2++;continue;} 
        if (k2>n){a[j]=b[k1];k1++;continue;}  
         if ((b[k1].fs>c[k2].fs)||((b[k1].fs==c[k2].fs)&&b[k1].xh<c[k2].xh))
                  {a[j]=b[k1];k1++;} 
           else {a[j]=c[k2];k2++;}       
       }
     
    }
    cout<<a[q].xh<<endl;
  
    return 0; 
    
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值