#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
using namespace std;
注意该考场数组区间为[num-k,num)和其他边界
同分则后面的排名要隔后,局部和全局处理不同,后者按顺序边计算总排名,边输出所有考生的信息

struct Student{
char id[15]; //准考证号
int score; //分数
int location_number; //考场号
int local_rank; //考场内排名
}stu[30010];
bool cmp(Student a,Student b){
if(a.score != b.score ) return a.score>b.score; //先按分数从高到低排序
else return strcmp(a.id,b.id)<0; //若分数相同,则按准考证号从小到大排序
}

int main(){
int n,k,num=0; //num为总考生数!!!!
scanf("%d",&n); //n为考场数
for(int i=1;i<=n;i++) {
scanf("%d",&k); //该考场内的人数
for(int j=0;j<k;j++){
scanf("%s %d",stu[num].id, &stu[num].score);
stu[num].location_number=i; //该考生的考场号为i
num++;
}
sort(stu+num-k,stu+num,cmp); //将该考场的考生排序
stu[num-k].local_rank=1; //该考场第1名的local_rank记为1
for(int j=num-k+1;j<num;j++){ //对该考场剩余的考生
if(stu[j].score == stu[j-1].score) { //如果与前一位考生同分
stu[j].local_rank=stu[j-1].local_rank; //loca_rank也相同
}else{ //如果与前一位考生不同,local_rank为该考生前的人数
stu[j].local_rank=j+1-(num-k) ;
}
}
}
printf("%d\n",num) ; //输出总考生数
sort(stu,stu+num,cmp); //将所有考生排序
int r=1; //当前考生的排名
for(int i=0;i<num;i++){
if(i>0 && stu[i].score != stu[i-1].score){
r=i+1; //当前考生与上一个考生分数不同时,让r更新为人数+1
}
printf("%s ",stu[i].id);
printf("%d %d %d\n",r,stu[i].location_number,stu[i].local_rank);
}
system("pause");
return 0;
}