为什么会MLE
查看原帖
为什么会MLE
443754
Sender_T楼主2021/8/31 14:26

rt

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define re register
using namespace std;
const int MAXN = 100001;
struct node{
	int id;
}pl[MAXN<<1],tmp[MAXN<<1];
int w[MAXN<<1],score[MAXN<<1];
bool cmp(node &x,node &y){
	if(score[x.id] == score[y.id]){
		return x.id < y.id;
	}else if(score[x.id] > score[y.id]){
		return true;
	}else if(score[x.id] < score[y.id]){
		return false;
	}
}
int n,r,q;
void mergesort(int l,int r){
	int mid = (l+r)>>1;
	if(r - l != 1){
		mergesort(l,mid);
		mergesort(mid + 1,r);
	}
	if(r - l == 1){
		if(w[pl[l].id] > w[pl[r].id]){
		score[pl[l].id]++;
	    }else{
		score[pl[r].id]++;
	    }
	}
	re int lp = l,rp = mid+1,k = lp;
	while(lp <= mid && rp <= r){
		if(score[pl[lp].id] < score[pl[rp].id]){
			tmp[k++] = pl[rp++];
		}else 
		if(score[pl[lp].id] == score[pl[rp].id]){
			if(pl[lp].id < pl[rp].id){
				tmp[k++] = pl[lp++];
			}
			else{
				tmp[k++] = pl[rp++];
			}
		}else
		if(score[pl[lp].id] > score[pl[rp].id]){
			tmp[k++] = pl[lp++];
		}
	}
	while(lp <= mid){
		tmp[k++] = pl[lp++];
	} 
	while(rp <= r){
		tmp[k++] = pl[rp++];
	}
	for(int i = l; i <= r; i++){
		pl[i] = tmp[i];
	}
	memset(tmp,0,sizeof(tmp));
}
int main(){
//	freopen("P1309_2.in","r",stdin);
//	freopen("out.txt","w",stdout);
    scanf("%d%d%d",&n,&r,&q);
	for(int i = 1 ; i <= n + n ; i++){
	   re int sc;
		scanf("%d",&sc);
		pl[i].id = i;
		score[pl[i].id] = sc;
	}
	for(int i = 1 ; i <= n + n ; i++){
	    re int worth;
		scanf("%d",&worth);
		w[pl[i].id] = worth;
	}
	sort(pl + 1,pl + 1 + n + n,cmp);
	while(r--){
		mergesort(1,n+n);
	}
	printf("%d\n",pl[q].id);
	return 0;
}
2021/8/31 14:26
加载中...