PAT 1025 PAT Ranking
#include <bits/stdc++.h>
using namespace std;
const int N = 3e4 + 10 ;
struct student{
string id;
int score;
int loc_id;
int loc_r;
int rank;
} stu[ N] ;
bool cmp1 ( student a, student b) {
if ( a. loc_id != b. loc_id) {
return a. loc_id < b. loc_id;
} else {
return a. score > b. score;
}
}
bool cmp2 ( student a, student b) {
if ( a. score != b. score) {
return a. score > b. score;
} else {
return a. id < b. id;
}
}
int main ( ) {
int n;
cin >> n;
int num = 0 ;
for ( int i = 1 ; i <= n; i++ ) {
int k;
cin >> k;
for ( int j = 1 ; j <= k; j++ ) {
cin >> stu[ num] . id >> stu[ num] . score;
stu[ num++ ] . loc_id = i;
}
}
sort ( stu, stu + num, cmp1) ;
int cnt = 1 ;
stu[ 0 ] . loc_r = 1 ;
for ( int i = 1 ; i < num; i++ ) {
if ( stu[ i] . loc_id != stu[ i- 1 ] . loc_id) {
cnt = 1 ;
stu[ i] . loc_r = 1 ;
} else {
cnt++ ;
if ( stu[ i] . score == stu[ i- 1 ] . score) {
stu[ i] . loc_r = stu[ i- 1 ] . loc_r;
} else {
stu[ i] . loc_r = cnt;
}
}
}
sort ( stu, stu + num, cmp2) ;
stu[ 0 ] . rank = 1 ;
for ( int i = 1 ; i < num; i++ ) {
if ( stu[ i] . score == stu[ i- 1 ] . score) {
stu[ i] . rank = stu[ i- 1 ] . rank;
} else stu[ i] . rank = i + 1 ;
}
cout << num << endl;
for ( int i = 0 ; i < num; i++ ) {
cout << stu[ i] . id << " " << stu[ i] . rank << " " << stu[ i] . loc_id << " " << stu[ i] . loc_r << endl;
}
return 0 ;
}