結果
| 問題 |
No.3329 Only the Rightest Choice is Right!!!
|
| コンテスト | |
| ユーザー |
applejam
|
| 提出日時 | 2025-11-01 18:03:23 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 76 ms / 1,571 ms |
| コード長 | 2,576 bytes |
| コンパイル時間 | 5,151 ms |
| コンパイル使用メモリ | 335,088 KB |
| 実行使用メモリ | 38,784 KB |
| 最終ジャッジ日時 | 2025-11-02 16:32:47 |
| 合計ジャッジ時間 | 8,502 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 74 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll = long long;
using mint = modint998244353;
using vi = vector<int>;
using vvi = vector<vi>;
using vvvi = vector<vvi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vvvll = vector<vvll>;
using vmi = vector<mint>;
using vvmi = vector<vmi>;
using vvvmi = vector<vvmi>;
#define all(a) (a).begin(), (a).end()
#define rep2(i, m, n) for (int i = (m); i < (n); ++i)
#define rep(i, n) rep2(i, 0, n)
#define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i)
#define drep(i, n) drep2(i, n, 0)
void solve(){
}
int op(int a, int b){
return max(a, b);
}
int e(){return -1;}
int main(){
int n, w; cin >> n >> w;
vi vv(n), vw(n);
rep(i, n)cin >> vv[i];
rep(i, n)cin >> vw[i];
//segtree<int, op, e> seg(n);
//vector<segtree<int, op, e>> vs(w+1, seg);
vvi dp(n, vi(w+1, -1));
dp[n-1][0] = 0; dp[n-1][vw[n-1]] = vv[n-1];
//vs[0].set(n-1, 0);
//vs[vw[n-1]].set(n-1, vv[n-1]);
drep(i, n-1){
rep(j, w+1){
/*int t = vs[j].get(i+1);
vs[j].set(i, t);
if(j - vw[i] < 0)continue;
int p = vs[j-vw[i]].get(i+1);
if(p == -1)continue;
if(t < p + vv[i])vs[j].set(i, p + vv[i]);*/
dp[i][j] = dp[i+1][j];
if(j - vw[i] < 0)continue;
if(dp[i+1][j - vw[i]] == -1)continue;
dp[i][j] = max(dp[i][j], dp[i+1][j - vw[i]] + vv[i]);
}
}
int tmp = 0;
rep(i, w+1)tmp = max(tmp, dp[0][i]);
int v = 0;
int itr = 0;
int now = 0;
vi ans;
while(v < tmp){
bool ff = false;
rep(j, w-now+1){
if(dp[n-1][j] >= tmp-v){
ans.push_back(n-1);
ff = true;
break;
}
}
if(ff)break;
int l = itr, r = n-1;
int mid;
while(r - l > 1){
mid = (r+l)/2;
bool f = false;
rep(j, w-now+1){
if(dp[mid][j] >= tmp-v){
f = true;
break;
}
}
if(f){
l = mid;
}else{
r = mid;
}
}
ans.push_back(l);
v += vv[l];
now += vw[l];
itr = l+1;
if(itr >= n)break;
}sort(all(ans));
cout << ans.size() << endl;
for(auto i : ans) cout << i+1 << " ";
cout << endl;
return 0;
}
applejam