結果
問題 | No.1538 引きこもりさんは引き算が得意。 |
ユーザー |
![]() |
提出日時 | 2021-06-06 18:45:08 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 56 ms / 2,000 ms |
コード長 | 1,289 bytes |
コンパイル時間 | 1,760 ms |
コンパイル使用メモリ | 177,248 KB |
実行使用メモリ | 8,960 KB |
最終ジャッジ日時 | 2024-12-14 05:26:15 |
合計ジャッジ時間 | 3,634 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 54 |
ソースコード
#include <bits/stdc++.h>using namespace std;void dfs(vector<set<long long>> &st, vector<long long> &A, long long S = 0, int s = 0, int p = 0){int N = A.size();if (p == N){st[s].insert(S);} else {dfs(st, A, S, s, p + 1);dfs(st, A, S + A[p], s | 1, p + 1);dfs(st, A, S - A[p], s | 2, p + 1);}}int main(){int N;long long K;cin >> N >> K;vector<long long> A(N);for (int i = 0; i < N; i++){cin >> A[i];}bool ok = false;for (int i = 0; i < N; i++){if (A[i] == K){ok = true;}}if (ok){cout << "Yes" << endl;} else {int X = N / 2, Y = N - X;vector<long long> A1(X);for (int i = 0; i < X; i++){A1[i] = A[i];}vector<set<long long>> st1(4);dfs(st1, A1);vector<long long> A2(Y);for (int i = 0; i < Y; i++){A2[i] = A[X + i];}vector<set<long long>> st2(4);dfs(st2, A2);bool ok2 = false;for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if ((i | j) == 3){for (long long x : st1[i]){if (st2[j].count(K - x) == 1){ok2 = true;}}}}}if (ok2){cout << "Yes" << endl;} else {cout << "No" << endl;}}}