WA on test 35,样例全过qwq
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 3e3 + 10;
int n, k, ans;
int a[N][N], f[N][N], use[N][N]; //a[i][0]记录数组长度,a[i][最后一位]记录数组元素总和
void dfs(int l, int r, int p = 1){
if(l == r){
int res = f[p][k];
if(k > use[p][k]) res += a[l][min(a[l][0],k - use[p][k])];
ans = max(ans, res);
return;
}
int mid = (l + r) >> 1;
memcpy(f[p + 1], f[p], sizeof(f[p + 1]));
memcpy(use[p + 1], use[p], sizeof(use[p + 1]));
for(int i = l; i <= mid; i ++)
for(int j = k; j >= a[i][0]; j --)
if(f[p + 1][j - a[i][0]] + a[i][a[i][0]] > f[p + 1][j]){
f[p + 1][j] = f[p + 1][j - a[i][0]] + a[i][a[i][0]];
use[p + 1][j] = use[p + 1][j - a[i][0]] + a[i][0];
}
dfs(mid + 1, r, p + 1);
memcpy(f[p + 1], f[p], sizeof(f[p + 1]));
memcpy(use[p + 1], use[p], sizeof(use[p + 1]));
for(int i = mid + 1; i <= r; i ++)
for(int j = k; j >= a[i][0]; j --)
if(f[p + 1][j - a[i][0]] + a[i][a[i][0]] > f[p + 1][j]){
f[p + 1][j] = f[p + 1][j - a[i][0]] + a[i][a[i][0]];
use[p + 1][j] = use[p + 1][j - a[i][0]] + a[i][0];
}
dfs(l, mid, p + 1);
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0);
cin>>n>>k;
for(int i = 1; i <= n; i ++){
cin>>a[i][0];
for(int j = 1; j <= a[i][0]; j ++){
cin>>a[i][j];
if(j > 1) a[i][j] += a[i][j - 1];
}
}
dfs(1, n);
cout<<ans<<"\n";
return 0;
}