結果
問題 | No.1635 Let’s Sort Integers!! |
ユーザー |
![]() |
提出日時 | 2021-07-30 22:01:56 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 495 ms / 2,000 ms |
コード長 | 2,684 bytes |
コンパイル時間 | 1,827 ms |
コンパイル使用メモリ | 177,296 KB |
実行使用メモリ | 56,320 KB |
最終ジャッジ日時 | 2024-09-16 00:14:20 |
合計ジャッジ時間 | 19,013 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 77 |
ソースコード
#include <bits/stdc++.h>using namespace std;void get(vector<int> A){int N = A.size();int p;for (int i = 0; i < N; i++){if (A[i] == 1 || A[i] == -1){p = i;}}vector<int> neg, pos;for (int i = 0; i < N; i++){if (i != p){if (A[i] == -1){neg.push_back(i);}if (A[i] == 1){pos.push_back(i);}}}for (int i = 0; i < N; i++){if (A[i] == -2){neg.push_back(i);}if (A[i] == 2){pos.push_back(i);}}set<int> st;for (int i = 0; i < N; i++){if (A[i] == 0){st.insert(i);}}vector<int> ans;ans.push_back(p);while (A[p] != 0){if (A[p] == -1){int p2 = pos.back();pos.pop_back();A[p]++;A[p2]--;while (true){auto itr = st.lower_bound(p);if (itr == st.end()){break;}if (*itr > p2){break;}ans.push_back(*itr);st.erase(itr);}p = p2;} else {int p2 = neg.back();neg.pop_back();A[p]--;A[p2]++;while (true){auto itr = st.lower_bound(p);if (itr == st.begin()){break;}itr--;if (*itr < p2){break;}ans.push_back(*itr);st.erase(itr);}p = p2;}ans.push_back(p);}for (int i = 0; i < N; i++){cout << ans[i] + 1;if (i < N - 1){cout << ' ';}}cout << endl;}int main(){int N;cin >> N;long long K;cin >> K;if (K < N - 1){cout << -1 << endl;} else if (K == N - 1){for (int i = 1; i <= N; i++){cout << i;if (i < N){cout << ' ';}}cout << endl;} else if (N == 2){cout << -1 << endl;} else {K -= N;vector<int> A(N, 0);A[0] = -1;A[N - 2] = -1;A[N - 1] = 2;int L = 1, R = N - 2;int d = 0;bool ok = false;while (R - L >= 1){if (K <= R - L){if (d == 0){A[R] = 0;A[R - K] = -1;get(A);ok = true;break;} else {A[L] = 0;A[L + K] = 1;get(A);ok = true;break;}}K -= R - L;if (d == 0){A[R] = 0;A[L] = -2;A[L + 1] = 1;K--;L++;d = 1;} else {A[L] = 0;A[R] = 2;A[R - 1] = -1;K--;R--;d = 0;}}if (!ok){if (K < N / 2){swap(A[0], A[K]);get(A);} else {cout << -1 << endl;}}}}