回答編集履歴
1
バグの修正
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 の変更になりました。
|