题目描述
分析
思路
为不同的类型设立flag,最后根据flag对结构体排序。
易错点
如果对STL sort函数的原理不是很了解,可能会犯一个错误:
sort函数是一种混合式排序函数,数据量较小时使用插排,插排在当原始序列为同一个flag时,不会改变其顺序,但是当数据量较大时,使用快排和堆排,同一个flag的顺序可能被改变。因此,还需要设置一个变量存储结点出现的顺序。
#include<iostream>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
struct node {
int add, val, next, flag, id;
}no[100000];
vector<node> v;
bool cmp(node a, node b) {
return a.flag!=b.flag?a.flag < b.flag:a.id<b.id;
}
int main() {
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int head, n, k;
cin >> head >> n >> k;
while(n--){
int i; cin >> i;
no[i].add = i;
scanf("%d%d", &no[i].val, &no[i].next);
if (no[i].val < 0) no[i].flag = 1;
else if (no[i].val <= k) no[i].flag = 2;
else no[i].flag = 3;
}
int cnt = 0;
for (int cur = head; cur != -1; cur = no[cur].next) {
no[cur].id = cnt++; //记录次序
v.push_back(no[cur]);
}
sort(v.begin(), v.end(), cmp);
for (int i = 0; i < v.size(); i++) {
printf("%05d %d ", v[i].add, v[i].val);
if (i != v.size() - 1) printf("%05d\n", v[i + 1].add);
else printf("-1\n");
}
return 0;
}