每个输入包含1个测试用例。每个测试用例第1行给出:第1个结点的地址;结点总个数,即正整数N (<= 105);以及正整数K (<=1000)。结点的地址是5位非负整数,NULL地址用-1表示。 接下来有N行,每行格式为: Address Data Next 其中_Address_是结点地址;_Data_是该结点保存的数据,为[-105, 105]区间内的整数;_Next_是下一结点的地址。题目保证给出的链表不为空。
voidspit(node *nodes, int first, int k){ while (first != -1) { if (nodes[first].value < 0) { neg.push_back(nodes[first]); } elseif (nodes[first].value <= k) { lesser.push_back(nodes[first]); } else { greater.push_back(nodes[first]); } first = nodes[first].next; } }
vector<node> ans;
voidmerge(){ ans = neg; for (int i = 0; i < lesser.size(); i++) { ans.push_back(lesser[i]); } for (int i = 0; i < greater.size(); i++) { ans.push_back(greater[i]); } }
voidprintAns(){ int i = 0; for (; i < ans.size() - 1; i++) { printf("%05d %d %05d\n", ans[i].first, ans[i].value, ans[i + 1].first); } printf("%05d %d -1\n", ans[i].first, ans[i].value); }
intmain(){ int first = 0, n = 0, k = 0, temp = 0; scanf("%d %d %d", &first, &n, &k); node nodes[100000]; for (int i = 0; i < n; i++) { scanf("%d", &temp); scanf("%d %d", &nodes[temp].value, &nodes[temp].next); nodes[temp].first = temp; } spit(nodes, first, k); merge(); printAns();