Java
测试点5超时
import java.io.*;
import java.util.*;
public class Main {
    static final int N = 100010;
    static Node[] nodes = new Node[N];
    static List<Node> L = new ArrayList<>();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] firstLine = br.readLine().split(" ");
        int head = Integer.parseInt(firstLine[0]);
        int n = Integer.parseInt(firstLine[1]);
        int k = Integer.parseInt(firstLine[2]);
        for (int i = 0; i < n; i++) {
            String[] inputs = br.readLine().split(" ");
            int ad = Integer.parseInt(inputs[0]);
            int data = Integer.parseInt(inputs[1]);
            int next = Integer.parseInt(inputs[2]);
            int flag;
            if (data < 0) flag = 2;
            else if (data <= k) flag = 1;
            else flag = 0;
            nodes[ad] = new Node(ad, data, next, flag, 0);
        }
        int cnt = 1;
        for (int p = head; p != -1; p = nodes[p].next) {
            nodes[p].num = cnt++;
            L.add(nodes[p]);
        }
        Collections.sort(L);
        for (int i = 0; i < L.size() - 1; i++) {
            System.out.printf("%05d %d %05d\n", L.get(i).ad, L.get(i).data, L.get(i + 1).ad);
        }
        System.out.printf("%05d %d -1\n", L.get(L.size() - 1).ad, L.get(L.size() - 1).data);
        br.close();
    }
}
class Node implements Comparable<Node> {
    int ad, data, next;
    int flag;  // <0: 2,[0, k]: 1,>k: 0
    int num;
    Node(int ad, int data, int next, int flag, int num) {
        this.ad = ad;
        this.data = data;
        this.next = next;
        this.flag = flag;
        this.num = num;
    }
    @Override
    public int compareTo(Node t) {
        if (this.flag != t.flag) return t.flag - this.flag;
        else return this.num - t.num;
    }
}C++
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 100010;
int n, k, head;
struct Node {
    int ad, data, next;
    int flag;    // <0: 2,[0, k]: 1,>k: 0
    int num;
    bool operator<(const Node &t) const {
        if (flag != t.flag) return flag > t.flag;
        else return num < t.num;
    }
} nodes[N];
vector<Node> L;
int main() {
    scanf("%d%d%d", &head, &n, &k);
    for (int i = 0; i < n; ++i) {
        int ad, data, next, flag;
        scanf("%d%d%d", &ad, &data, &next);
        if (data < 0) flag = 2;
        else if (0 <= data && data <= k) flag = 1;
        else flag = 0;
        nodes[ad] = {ad, data, next, flag, 0};
    }
    int cnt = 1;
    for (int p = head; p != -1; p = nodes[p].next) {
        nodes[p].num = cnt++;
        L.push_back(nodes[p]);
    }
    sort(L.begin(), L.end());
    for (int i = 0; i < L.size() - 1; ++i)
        printf("%05d %d %05d\n", L[i].ad, L[i].data, L[i + 1].ad);
    printf("%05d %d -1\n", L[L.size() - 1].ad, L[L.size() - 1].data);
    return 0;
}
