40求调
查看原帖
40求调
1011587
Winalways楼主2024/10/13 19:59
#include <bits/stdc++.h>
using namespace std;
const int N=2*1e5+10;
struct Medal{
	int g,s,b,xb,pm;
} a[N],s1[N],s2[N],s3[N];
struct Ans{
	int M,rk;
}ans1[N],ans2[N],ans3[N],ret1[N],ret2[N],ret3[N];
int n;
//找左边第一次出现
int bs1(Ans a[],int k){
	int l=0,r=n-1;
	while(l<=r){
		int mid=l+(r-l)/2;
		if(a[mid].M>k) r=mid-1;
		else if(a[mid].M<k) l=mid+1;
		else if(a[mid].M==k) r=mid-1;
	}
	if(a[l].M==k)return l;
	return -1;
}
	

//4种排序
bool cmp1(Medal ta,Medal tb){return ta.g>tb.g;}
bool cmp2(Medal ta,Medal tb){return ta.s>tb.s;}
bool cmp3(Medal ta,Medal tb){return ta.b>tb.b;}
bool cmp4(Ans a,Ans b){return a.M<b.M;}
int main(){
	//数据处理
	cin>>n;
	for(int i=0;i<n;i++) {
		cin>>a[i].g>>a[i].b>>a[i].s;
		a[i].xb=i;
		s1[i]={a[i].g,a[i].b,a[i].s,i};
		s2[i]={a[i].g,a[i].b,a[i].s,i};
		s3[i]={a[i].g,a[i].b,a[i].s,i};
	}
	//排序
	sort(s1,s1+n,cmp1);
	sort(s2,s2+n,cmp2);
	sort(s3,s3+n,cmp3);
	//排名
	for(int i=0;i<n;i++){
		ans1[s1[i].xb]={s1[i].g,i+1};
		ans2[s2[i].xb]={s2[i].s,i+1};
		ans3[s3[i].xb]={s3[i].b,i+1};
		ret1[s1[i].xb]={s1[i].g,i+1};
		ret2[s2[i].xb]={s2[i].s,i+1};
		ret3[s3[i].xb]={s3[i].b,i+1};
	}
	
	sort(ans1,ans1+n,cmp4);
	sort(ans2,ans2+n,cmp4);
	sort(ans3,ans3+n,cmp4);
	for(int i=0;i<n;i++){
		
		int tmp1=bs1(ans1,ret1[i].M);
		int tmp2=bs1(ans2,ret2[i].M);
		int tmp3=bs1(ans3,ret3[i].M);
		cout<<min(ans1[tmp1].rk,min(ans2[tmp2].rk,ans3[tmp3].rk))<<endl;
	}
	return 0;
}
2024/10/13 19:59
加载中...