結果
問題 | No.1872 Dictionary Order |
ユーザー |
![]() |
提出日時 | 2022-03-11 21:58:50 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 28 ms / 2,000 ms |
コード長 | 4,319 bytes |
コンパイル時間 | 2,548 ms |
コンパイル使用メモリ | 206,680 KB |
最終ジャッジ日時 | 2025-01-28 08:37:49 |
ジャッジサーバーID (参考情報) |
judge1 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 32 |
ソースコード
#include <bits/stdc++.h>using namespace std;using ll = long long;#define rep(i, n) for (int i = 0; i < n; i++)#define all(v) v.begin(), v.end()template <class T, class U>inline bool chmax(T &a, U b) {if (a < b) {a = b;return true;}return false;}template <class T, class U>inline bool chmin(T &a, U b) {if (a > b) {a = b;return true;}return false;}constexpr int INF = 1000000000;constexpr ll llINF = 3000000000000000000;constexpr int mod = 998244353;const ll half = (mod + 1) / 2;constexpr double eps = 1e-10;vector<int> prime_list(int n) {vector<int> v(n + 1), res;for (int i = n; i >= 2; i--) {for (int j = i; j <= n; j += i) v[j] = i;}for (int i = 2; i <= n; i++) {if (v[i] == i) res.push_back(i);}return res;}vector<int> next_divisor(int n) {vector<int> v(n + 1);for (int i = n; i >= 2; i--) {for (int j = i; j <= n; j += i) v[j] = i;}return v;}ll modpow(ll a, ll b, ll m = mod) {ll res = 1;while (b) {if (b & 1) {res *= a;res %= m;}a *= a;a %= m;b >>= 1;}return res;}vector<ll> inv, fact, factinv;void init_fact(int n) {inv.resize(n + 1);fact.resize(n + 1);factinv.resize(n + 1);inv[0] = 0;inv[1] = 1;fact[0] = 1;factinv[0] = 1;for (ll i = 1; i <= n; i++) {if (i >= 2) inv[i] = mod - ((mod / i) * inv[mod % i] % mod);fact[i] = (fact[i - 1] * i) % mod;factinv[i] = factinv[i - 1] * inv[i] % mod;}}ll modinv(ll a, ll m = mod) {// gcd(a,m) must be 1ll b = m, u = 1, v = 0;while (b) {ll t = a / b;a -= t * b;swap(a, b);u -= t * v;swap(u, v);}u %= m;if (u < 0) u += m;return u;}ll comb(int a, int b) {if (a < b || a < 0 || b < 0) return 0;return fact[a] * factinv[a - b] % mod * factinv[b] % mod;}using S = pair<int, int>;S op(S a, S b) { return max(a, b); }S e() { return S{-1, 0}; }struct dual_segtree {int sz = 1, log = 0;vector<S> lz;dual_segtree(vector<S> a) {int n = a.size();while (sz < n) {sz <<= 1;log++;}lz.assign(sz << 1, e());for (int i = 0; i < n; i++) lz[i + sz] = a[i];}void push(int k) {int b = __builtin_ctz(k);for (int d = log; d > b; d--) {lz[k >> d << 1] = op(lz[k >> d << 1], lz[k >> d]);lz[k >> d << 1 | 1] = op(lz[k >> d << 1 | 1], lz[k >> d]);lz[k >> d] = e();}}void apply(int l, int r, S x) {l += sz, r += sz;push(l);push(r);while (l < r) {if (l & 1) {lz[l] = op(lz[l], x);l++;}if (r & 1) {r--;lz[r] = op(lz[r], x);}l >>= 1, r >>= 1;}}S get(int k) {k += sz;S res = e();while (k) {res = op(res, lz[k]);k >>= 1;}return res;}};void solve() {int n, m;cin >> n >> m;vector<int> a(n), p(n);rep(i, n) cin >> a[i];rep(i, n) cin >> p[i];vector<bitset<2001>> dp(n + 1);dp[n].set(0);for (int i = n - 1; i >= 0; i--) {rep(j, 2001) {if (dp[i + 1][j]) {dp[i].set(j);if (j + a[i] <= m) dp[i].set(j + a[i]);}}}int l = 0;vector<int> ans;while (1) {int mi = INF, mi_i = -1;for (int i = l; i < n; i++) {if (m - a[i] >= 0 && dp[i + 1][m - a[i]]) {if (chmin(mi, p[i])) {mi_i = i;}}}// cout << endl;if (mi == INF) break;ans.push_back(mi_i);l = mi_i + 1;m -= a[mi_i];}if (m == 0) {cout << ans.size() << endl;for (int i : ans) cout << i + 1 << " ";cout << endl;} elsecout << -1 << endl;}int main() {cin.tie(0);ios::sync_with_stdio(false);/*int t;cin >> t;while (t--)*/solve();}