#include <stdio.h> //第1位表示四类考生,接下来3位表示总分,再接着3位表示德分,后8位表示准考证号 #define x 100000000000000 #define y 100000000000 #define z 100000000 int getStandard(long long array[], int i, int j) { // 基准数据 long long key = array[i]; while (i < j) { // 因为默认基准是从左边开始,所以从右边开始比较 // 当队尾的元素大于等于基准数据 时,就一直向前挪动 j 指针 while (i < j && array[j] <= key) { j--; } // 当找到比 array[i] 小的时,就把后面的值 array[j] 赋给它 if (i < j) { array[i] = array[j]; } // 当队首元素小于等于基准数据 时,就一直向后挪动 i 指针 while (i < j && array[i] >= key) { i++; } // 当找到比 array[j] 大的时,就把前面的值 array[i] 赋给它 if (i < j) { array[j] = array[i]; } } // 跳出循环时 i 和 j 相等,此时的 i 或 j 就是 key 的正确索引位置 // 把基准数据赋给正确位置 array[i] = key; return i; } void QuickSort(long long array[], int low, int high) { // 开始默认基准为 low if (low < high) { // 分段位置下标 int standard = getStandard(array, low, high); // 递归调用排序 // 左边排序 QuickSort(array, low, standard - 1); // 右边排序 QuickSort(array, standard + 1, high); } } int main() { int N, L, H; scanf("%d %d %d", &N, &L, &H); long long id, d, c ,sum;//定义考号,德分,才分,才德总分 int count = 0;//count为上线学生人数, long long stu[100001], temp,lev;//lev为学生类别 for (int i = 0; i < N; i++) { scanf("%lld %lld %lld", &id, &d, &c); if (d >= L && c >= L) { sum = d + c; if (d >= H && c >= H) { lev = 4;//归为第一类考生 } else if (d >= H) { lev = 3;//归为第二类考生 } else if (d >= c) { lev = 2;//归为第三类考生 } else { lev = 1;//归为其他类考生 } stu[count] = lev * x + sum * y + d * z + z - id;//考生类别优先,其次总分,再次德分,最次考号升序 count++; } } QuickSort(stu, 0, count - 1);//快速排序 printf("%d\n", count); for (int i = 0; i < count; i++) { sum = stu[i] % x / y; id = z - stu[i] % z; d = stu[i] % y / z; c = sum - d; printf("%lld %lld %lld\n", id, d, c); } return 0; }