萌,求,懂?
  • 板块CF1442D Sum
  • 楼主Ackoter
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/10/12 21:38
  • 上次更新2023/11/4 03:57:33
查看原帖
萌,求,懂?
13805
Ackoter楼主2021/10/12 21:38

死在第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;
}
2021/10/12 21:38
加载中...