回答編集履歴
1
バグの修正
answer
CHANGED
@@ -48,4 +48,34 @@
|
|
48
48
|
時刻 15~18 は 2人
|
49
49
|
時刻 18~23 は 3人
|
50
50
|
時刻 23~25 は 2人
|
51
|
-
時刻 25~27 は 1人
|
51
|
+
時刻 25~27 は 1人
|
52
|
+
|
53
|
+
**追記**
|
54
|
+
バグがあったので、qsort に与える比較関数 comp を次のように訂正します。
|
55
|
+
```C
|
56
|
+
int comp(const void *x, const void *y)
|
57
|
+
{
|
58
|
+
int d = ((struct Data *)x)->time - ((struct Data *)y)->time;
|
59
|
+
return d ? d : ((struct Data *)x)->se - ((struct Data *)y)->se;
|
60
|
+
}
|
61
|
+
```
|
62
|
+
どういうバグかというと、
|
63
|
+
2
|
64
|
+
10 20
|
65
|
+
20 30
|
66
|
+
このような入力があった場合、時刻20 において人が入れ替わるわけですが、
|
67
|
+
これを 2人が同時に走っていると解釈してしまうことがあるのです。
|
68
|
+
コードを見ればわかるように、この入力を data[] に
|
69
|
+
10 1
|
70
|
+
20 -1
|
71
|
+
20 1
|
72
|
+
30 -1
|
73
|
+
と取り込んだ後、ソートするのですが、qsort は安定ソートではないので
|
74
|
+
2つの同じ値 20 について、どちらが先になるかが決定していません。
|
75
|
+
10 1
|
76
|
+
20 1
|
77
|
+
20 -1
|
78
|
+
30 -1
|
79
|
+
となることがあるのです。安定ソートに変更しても、入力データが
|
80
|
+
ソートされているとは限りません。
|
81
|
+
そこで、今回の comp の変更になりました。
|