質問編集履歴
2
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -144,3 +144,105 @@
|
|
144
144
|
```
|
145
145
|
としようとしたのですが、ラムダ関数をstable_sort()には使えないとコンパイルエラーが起きました。このような場合、どのようにすれば所望の出力を得られるのでしょうか。素人質問にて恐縮ですが、お力添え頂ける箇所が御座いましたら、ご教授のほど宜しくお願い申し上げます。
|
146
146
|
|
147
|
+
追記)このようにソート関数を自作しても同じテストケースで引っかかり駄目でした:
|
148
|
+
```C++
|
149
|
+
#include <bits/stdc++.h>
|
150
|
+
#include <math.h>
|
151
|
+
using namespace std;
|
152
|
+
#define ll long long
|
153
|
+
|
154
|
+
/* import vector from standard input */
|
155
|
+
vector<ll> import_vector(ll n) { vector<ll> li; for (ll i = 0; i < n; i++) { ll j; cin >> j; li.push_back(j); } return li; }
|
156
|
+
|
157
|
+
/* sorted(li, key = lambda x: x[K], ascending = x) */
|
158
|
+
vector<vector<ll>> key_sort(vector<vector<ll>> li, ll K, bool x) {
|
159
|
+
vector<vector<ll>> ans = {};
|
160
|
+
for (ll i = 0; i < li.size(); i++) {
|
161
|
+
ans.push_back(li.at(i));
|
162
|
+
}
|
163
|
+
for (ll i = 0; i < ans.size(); i++) {
|
164
|
+
swap(ans.at(i).at(0), ans.at(i).at(K));
|
165
|
+
}
|
166
|
+
if (!x) {
|
167
|
+
stable_sort(ans.begin(), ans.end());
|
168
|
+
reverse(ans.begin(), ans.end());
|
169
|
+
}
|
170
|
+
else {
|
171
|
+
stable_sort(ans.begin(), ans.end());
|
172
|
+
}
|
173
|
+
|
174
|
+
for (ll i = 0; i < ans.size(); i++) {
|
175
|
+
swap(ans.at(i).at(0), ans.at(i).at(K));
|
176
|
+
}
|
177
|
+
return ans;
|
178
|
+
}
|
179
|
+
|
180
|
+
void solve() {
|
181
|
+
ll N, X, Y, Z; cin >> N >> X >> Y >> Z;
|
182
|
+
vector<ll> A = import_vector(N);
|
183
|
+
vector<ll> B = import_vector(N);
|
184
|
+
|
185
|
+
vector<vector<ll>> score = {};
|
186
|
+
for (ll i = 0; i < N; i++) {
|
187
|
+
score.push_back({A.at(i), B.at(i), A.at(i) + B.at(i), i + 1});
|
188
|
+
}
|
189
|
+
|
190
|
+
map<ll, bool> passed = {};
|
191
|
+
for (ll i = 1; i < N + 1; i++) {
|
192
|
+
passed[i] = false;
|
193
|
+
}
|
194
|
+
|
195
|
+
vector<ll> ans = {};
|
196
|
+
|
197
|
+
score = key_sort(score, 3, false);
|
198
|
+
score = key_sort(score, 0, true);
|
199
|
+
|
200
|
+
for (vector<ll> el: score) {
|
201
|
+
show(el);
|
202
|
+
}
|
203
|
+
ll L1 = score.size();
|
204
|
+
for (ll i = L1 - 1; i >= L1 - X; i--) {
|
205
|
+
passed[score.at(i).at(3)] = true;
|
206
|
+
ans.push_back(score.at(i).at(3));
|
207
|
+
}
|
208
|
+
|
209
|
+
vector<vector<ll>> score2 = {};
|
210
|
+
for (ll i = 0; i < score.size(); i++) {
|
211
|
+
if (passed[score.at(i).at(3)] == false) {
|
212
|
+
score2.push_back(score.at(i));
|
213
|
+
}
|
214
|
+
}
|
215
|
+
|
216
|
+
score2 = key_sort(score2, 3, false);
|
217
|
+
score2 = key_sort(score2, 1, true);
|
218
|
+
ll L2 = score2.size();
|
219
|
+
for (ll i = L2 - 1; i >= L2 - Y; i--) {
|
220
|
+
passed[score2.at(i).at(3)] = true;
|
221
|
+
ans.push_back(score2.at(i).at(3));
|
222
|
+
}
|
223
|
+
|
224
|
+
vector<vector<ll>> score3 = {};
|
225
|
+
for (ll i = 0; i < score2.size(); i++) {
|
226
|
+
if (passed[score2.at(i).at(3)] == false) {
|
227
|
+
score3.push_back(score2.at(i));
|
228
|
+
}
|
229
|
+
}
|
230
|
+
|
231
|
+
score3 = key_sort(score3, 3, false);
|
232
|
+
score3 = key_sort(score3, 2, true);
|
233
|
+
ll L3 = score3.size();
|
234
|
+
for (ll i = L3 - 1; i >= L3 - Z; i--) {
|
235
|
+
ans.push_back(score3.at(i).at(3));
|
236
|
+
}
|
237
|
+
|
238
|
+
sort(ans.begin(), ans.end());
|
239
|
+
for (ll el: ans) {
|
240
|
+
cout << el << endl;
|
241
|
+
}
|
242
|
+
}
|
243
|
+
|
244
|
+
int main() {
|
245
|
+
solve();
|
246
|
+
}
|
247
|
+
```
|
248
|
+
|
1
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -130,7 +130,7 @@
|
|
130
130
|
```
|
131
131
|
|
132
132
|
**改善策と質問**
|
133
|
-
後者がうまくいかなかった理由として、C++のSTLで実装されるsort()が安定ソートではなく不安定ソートである為、ケースによっては受験者の番号の順序を保存したまま点数を並び替え出来ないからという
|
133
|
+
後者がうまくいかなかった理由として、C++のSTLで実装されるsort()が安定ソートではなく不安定ソートである為、ケースによっては受験者の番号の順序を保存したまま点数を並び替え出来ないからと推測しています。そうであるとした場合そこで、例えば
|
134
134
|
```C++
|
135
135
|
sort(score1.begin(), score1.end(), [] (vector<ll> &alpha, vector<ll> &beta) {return alpha[3] < beta[3];});
|
136
136
|
reverse(score1.begin(), score1.end());
|