回答編集履歴

1

バグの修正

2020/04/19 03:30

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -99,3 +99,63 @@
99
99
  時刻 23~25 は 2人
100
100
 
101
101
  時刻 25~27 は 1人
102
+
103
+
104
+
105
+ **追記**
106
+
107
+ バグがあったので、qsort に与える比較関数 comp を次のように訂正します。
108
+
109
+ ```C
110
+
111
+ int comp(const void *x, const void *y)
112
+
113
+ {
114
+
115
+ int d = ((struct Data *)x)->time - ((struct Data *)y)->time;
116
+
117
+ return d ? d : ((struct Data *)x)->se - ((struct Data *)y)->se;
118
+
119
+ }
120
+
121
+ ```
122
+
123
+ どういうバグかというと、
124
+
125
+ 2
126
+
127
+ 10 20
128
+
129
+ 20 30
130
+
131
+ このような入力があった場合、時刻20 において人が入れ替わるわけですが、
132
+
133
+ これを 2人が同時に走っていると解釈してしまうことがあるのです。
134
+
135
+ コードを見ればわかるように、この入力を data[] に
136
+
137
+ 10 1
138
+
139
+ 20 -1
140
+
141
+ 20 1
142
+
143
+ 30 -1
144
+
145
+ と取り込んだ後、ソートするのですが、qsort は安定ソートではないので
146
+
147
+ 2つの同じ値 20 について、どちらが先になるかが決定していません。
148
+
149
+ 10 1
150
+
151
+ 20 1
152
+
153
+ 20 -1
154
+
155
+ 30 -1
156
+
157
+ となることがあるのです。安定ソートに変更しても、入力データが
158
+
159
+ ソートされているとは限りません。
160
+
161
+ そこで、今回の comp の変更になりました。