想不通为什么会超时
查看原帖
想不通为什么会超时
340222
代码练习生楼主2020/7/15 17:32
#include<stdio.h>
#include<stdlib.h>

int ** info, ** buf;

void
swap(int * * info,int i){
    int *temp;
    
    temp=info[i];
    info[i]=info[i-1];
    info[i-1]=temp;
}

void
maopao(int ** info,int len){
    int i,j,flag;
    
    for(i=0;i<len-1;i=flag){
        flag=len-1;
        for(j=len-1;j>i;j--){
            if(info[j][1]> info[j-1][1] || (info[j-1][0]>info[j][0] && info[j][1]==info[j-1][1])){
                swap(info,j);
                flag=j;
            }
        }
    }
}

void
merge(int l,int r){
    int mid,i,j,k;
    
    if(l>=r)
        return ;
    mid=(l+r)>>1;
    merge(l,mid);
    merge(mid+1,r);
    
    i=k=l,j=mid+1;
    while(i<=mid && j<=r){
        if(info[i][1]>info[j][1] || (info[i][1]==info[j][1] && info[i][0]<info[j][0])){
            buf[k++]=info[i++];
        }else{
            buf[k++]=info[j++];
        }
    }
    while(i<=mid)
        buf[k++]=info[i++];
    while(j<=r)
        buf[k++]=info[j++];
    for(i=l;i<=r;i++){
        info[i]=buf[i];
    }
}

/*
应该是冒泡太慢了,过不了,优化也没用,
看来给的数据应该是随机的,快排什么的,,,又懒得写,,,
过了三个,开O2优化过了5个,,,
【更新】尼玛,,,归并也超时了,,,这说明不完全是冒泡的原因,下面
那种写法是不行的,有点难以理解,,,
*/
int
main(){
    int N,R,Q,i,j;
    
    scanf("%d%d%d",&N,&R,&Q);
    info=malloc(sizeof(int *)*2*N);
    buf=malloc(sizeof(int *)*2*N);
    
    for(i=0;i<2*N;i++){
        info[i]=malloc(sizeof(int)*3);
        info[i][0]=i+1;
        scanf("%d",info[i]+1);
    }
    for(i=0;i<2*N;i++){
        scanf("%d",info[i]+2);
    }
    
    // maopao(info,2*N);
    merge(0,2*N-1);
    while(R--){        
    
    /*每一轮胜利者加一,失败者不变,
    所以只要把胜利者往上面提就可以了,一般而言,不会提太多次。不必每轮都来一次排序,很多题解
    都是划分成两个降序集合来归并排序,我感觉没有必要。
    */
        i=0;
        while(i<2*N){
            j=i;
            if(info[i][2]<info[i+1][2]){
                i+=1;
            }
            info[i][1]+=1;
            while(i!=0 && (info[i-1][1]< info[i][1] || (info[i-1][0]>info[i][0] && info[i-1][1]==info[i][1]))){
                swap(info,i);
                i--;
            }
            i=j+2;
        }
    }
    printf("%d",info[Q-1][0]);
    return 0;
}
2020/7/15 17:32
加载中...