質問編集履歴

2

追記

2022/07/17 19:22

投稿

kay_ventris4
kay_ventris4

スコア269

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

修正

2022/07/17 19:05

投稿

kay_ventris4
kay_ventris4

スコア269

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());