死在第12个点,答案差不多,1620...和1619...
#include<iostream>
#include<cstdio>
#include<bitset>
#define mid ((l+r)>>1)
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
int n,k;
int t[6005],head[6005],juruo;
int az[2000001],m;
long long lj[6005],dp[6005],lj2,ma;
void fz(int l,int r)
{
if(l==r)
{
lj2=0;
for(int i=0;i<=min(t[l],k);i++)
{
ma=max(ma,lj2+dp[k-i]);
lj2+=az[i+head[l]];
}
return;
}
int jc[6005];
for(int i=0;i<=k;i++) jc[i]=dp[i];
for(int i=mid+1;i<=r;i++)
for(int j=k-t[i];j>=0;j--)
dp[j+t[i]]=max(dp[j]+lj[i],dp[j+t[i]]);
fz(l,mid);
for(int i=0;i<=k;i++) dp[i]=jc[i];
for(int i=l;i<=mid;i++)
for(int j=k-t[i];j>=0;j--)
dp[j+t[i]]=max(dp[j]+lj[i],dp[j+t[i]]);
fz(mid+1,r);
}
int main()
{
// freopen("az.txt","r",stdin);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&t[i]);
head[i]=m+1;
for(int j=1;j<=t[i];j++) {scanf("%d",&az[++m]);lj[i]+=az[m];}
juruo+=t[i];
}
if(juruo>k) fz(1,n); else
for(int i=1;i<=n;i++) ma+=lj[i];
printf("%lld",ma);
return 0;
}