注意:在OJ上提交时不要使用endl,可能会出问题。用\n
代替。
描述
已知
-
小 g 手里有一个链表。
-
小 g 希望手里的链表是按照单调非减的顺序排好的。
-
小 g 希望链表中值相同的节点在排完序后相对次序也不会改变。
-
小 g 很笨。
聪明的你快来帮帮小 g,实现他的愿望。
输入
第一行为两个整数,分别为小 g 的链表中节点的个数 N (0 ≤ N ≤ 100000),和第一个节点的编号 H (1 ≤ H ≤ N)。
接下来的 N 行中,第 i (1 ≤ i ≤ N) 行包含两个整数,分别为编号为 i 的节点的值 Ai (-10^9 ≤ Ai ≤ 10^9) 和它的下一个节点的编号 Bi (0 ≤ Bi ≤ N)。
约定链表中最后一个节点的下一个节点的编号用 0 表示,且空链表第一个节点编号用 0 表示。
输出
第一行为一个整数,为排序后的链表中第一个节点的编号。
接下来的 N 行中,第 i (1 ≤ i ≤ N) 行包含一个整数,为排序后的链表中编号 i 的节点的下一个节点的编号 Bi’ (0 ≤ Bi’ ≤ N)。
样例输入
3 2
2 3
3 1
1 0
扫描二维码关注公众号,回复:
5977878 查看本文章
样例输出
3
2
0
1
我的测试用例
20 1
20 2
19 3
18 4
17 5
16 6
15 7
14 8
13 9
12 10
11 11
11 12
11 13
11 14
11 15
11 16
11 17
11 18
11 19
11 20
11 0
输出结果(是对的吧)
10
0
1
2
3
4
5
6
7
8
11
12
13
14
15
16
17
18
19
20
9
代码
只通过了自己的测试用例,没通过OJ
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Node
{
public:
int num;
int value;
int next;
};
int mysort(Node a1, Node a2)
{
return(a1.value < a2.value);
}
int main()
{
int total, first;
cin >> total >> first;
//空链表检测
if (total == 0)
{
cout << '0';
return 0;
}
//原链表
vector<Node> linklist;
Node tNode;
int i;
for (i = 0; i < total; i++)
{
tNode.num = i + 1;
cin >> tNode.value >> tNode.next;
tNode.next = 0;//此数据无用置零
linklist.push_back(tNode);
}
//复制
vector<Node> resultlist(linklist);
//排序
stable_sort(linklist.begin(), linklist.end(), mysort);
//填写
int j;
for (i = 0; i < total; i++)
{
resultlist[linklist[i].num - 1].next = (i + 1 < total ? linklist[i + 1].num : 0);
}
//输出
cout << linklist[0].num << endl;
for (i = 0; i < total; i++)
{
cout << resultlist[i].next << '\n';
}
cout << endl;
system("pause");
return 0;
}