結果
問題 | No.1017 Reiwa Sequence |
ユーザー |
![]() |
提出日時 | 2022-04-12 16:27:58 |
言語 | C++17(clang) (17.0.6 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 342 ms / 2,000 ms |
コード長 | 1,937 bytes |
コンパイル時間 | 2,483 ms |
コンパイル使用メモリ | 146,992 KB |
実行使用メモリ | 50,048 KB |
最終ジャッジ日時 | 2024-12-17 23:17:06 |
合計ジャッジ時間 | 33,536 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 50 |
ソースコード
#include <cassert>#include <cmath>#include <algorithm>#include <iostream>#include <iomanip>#include <climits>#include <map>#include <queue>#include <set>#include <cstring>#include <vector>using namespace std;typedef long long ll;vector<int> A;map<int, vector<int>> memo1;map<int, vector<int>> memo2;int L;void dfs(int i, int end, int sum, bool ok, vector<int> &nums) {if (i == end) {if (ok) {if (end < L) {memo1[sum] = nums;} else {memo2[sum] = nums;}}} else {for (int a = -1; a <= 1; ++a) {int v = A[i] * a;nums.push_back(v);if (a == 0) {dfs(i + 1, end, sum + v, ok, nums);} else {dfs(i + 1, end, sum + v, true, nums);}nums.pop_back();}}}int main() {int N;cin >> N;if (N == 1) {cout << "No" << endl;return 0;}A.resize(N);for (int i = 0; i < N; ++i) {cin >> A[i];}L = min(N, 22);int mid = L / 2;vector<int> nums;dfs(0, mid, 0, false, nums);dfs(mid, L, 0, false, nums);int ans[N];memset(ans, 0, sizeof(ans));bool ok = false;for (auto &[sum, nums] : memo1) {if (sum == 0) {ok = true;for (int i = 0; i < nums.size(); ++i) {ans[i] = nums[i];}} else {if (memo2.count(-sum)) {ok = true;vector<int> temp = nums;temp.insert(temp.end(), memo2[-sum].begin(), memo2[-sum].end());for (int i = 0; i < temp.size(); ++i) {ans[i] = temp[i];}}}}if (not ok && memo2.count(0)) {ok = true;vector<int> &nums = memo2[0];for (int i = mid; i < L; ++i) {ans[i] = nums[i - mid];}}if (ok) {cout << "Yes" << endl;for (int i = 0; i < N; ++i) {cout << ans[i];if (i != N - 1) cout << " ";}cout << endl;} else {cout << "No" << endl;}return 0;}