結果
問題 | No.1861 Required Number |
ユーザー |
|
提出日時 | 2022-03-02 12:44:39 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 182 ms / 2,500 ms |
コード長 | 938 bytes |
コンパイル時間 | 1,985 ms |
コンパイル使用メモリ | 202,696 KB |
最終ジャッジ日時 | 2025-01-28 04:19:00 |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 46 |
ソースコード
#include <bits/stdc++.h> using namespace std; using bitst = bitset<100001>; int main() { int N, K; cin >> N >> K; vector<int> A(N); for (int i = 0; i < N; ++i) cin >> A[i]; int B = sqrt(N), C = (N + B - 1) / B; vector<bitst> memo_dpl(C); bitst dpl; dpl[0] = 1; for (int i = 0; i < N; ++i) { if (i % B == 0) memo_dpl[i / B] = dpl; dpl |= dpl << A[i]; } if (!dpl[K]) { puts("-1"); return 0; } bitst dpr; dpr[K] = 1; int ans = 0; for (int i = C - 1; i >= 0; --i) { vector<bitst> memo(B); memo[0] = memo_dpl[i]; for (int j = 0; j < min(B, N - i * B) - 1; ++j) { memo[j + 1] = memo[j] | (memo[j] << A[i * B + j]); } for (int j = min(B, N - i * B) - 1; j >= 0; --j) { if ((memo[j] & dpr).none()) ++ans; dpr = dpr | (dpr >> A[i * B + j]); } } cout << ans << endl; }