Loading

Code

#include<bits/stdc++.h>
using namespace std;
template <typename T> inline void read(T &x)
{
	x=0;short f=1;char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) if(c=='-') f=-1;
	for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	x*=f;return;
}
#define ll long long
const int N=3e5+5;
int n,m,K;
int a[N],b[N],c[N];
int f[N],dp[20][N],g[2][N];
int find(int l,int r,int u)
{
	r=min(r,u);
	while(l<r)
	{
		int mid=(l+r+1)>>1;
		for(int i=1;i<=m;++i) g[1][i]=g[0][i];
		for(int i=l;i<mid;++i)
			for(int j=m;j>=a[i];--j)
				g[1][j]=max(g[1][j-a[i]]+c[i],g[1][j]);
		for(int i=mid;i<=r;++i)
			for(int j=m;j>=b[i];--j)
				g[1][j]=max(g[1][j-b[i]]+c[i],g[1][j]);
		ll sum=0;
		for(int i=1;i<=m;++i) sum+=g[1][i];
		if(sum<=1ll*K*m)
		{
			for(int i=l;i<mid;++i)
				for(int j=m;j>=a[i];--j)
					g[0][j]=max(g[0][j-a[i]]+c[i],g[0][j]);
			l=mid;
		}
		else
		{
			for(int i=mid;i<=r;++i)
				for(int j=m;j>=b[i];--j)
					g[0][j]=max(g[0][j-b[i]]+c[i],g[0][j]);
			r=mid-1;
		}
	}
	for(int j=m;j>=b[l];--j)
		g[0][j]=max(g[0][j-b[l]]+c[l],g[0][j]);
	ll sum=0;
	for(int i=1;i<=m;++i) sum+=g[0][i];
	return l-(sum>1ll*K*m);
}
void solve(int d,int l,int r,int L,int R)
{
	if(L==R)
	{
		for(int i=l;i<=r;++i) f[i]=L;
		return;
	}
	int Mid=(L+R)>>1;
	for(int i=1;i<=m;++i) dp[d+1][i]=dp[d][i];
	for(int i=Mid+1;i<=R;++i)
		for(int j=m;j>=a[i];--j)
			dp[d+1][j]=max(dp[d+1][j-a[i]]+c[i],dp[d+1][j]);
	for(int i=max(r+1,L);i<=Mid;++i)
		for(int j=m;j>=b[i];--j)
			dp[d+1][j]=max(dp[d+1][j-b[i]]+c[i],dp[d+1][j]);
	for(int i=1;i<=m;++i) g[0][i]=dp[d+1][i];
	int mid=find(l,r,Mid);
	if(l<=mid)
	{
		for(int i=1;i<=m;++i) dp[d+1][i]=dp[d][i];
		for(int i=Mid+1;i<=R;++i)
			for(int j=m;j>=a[i];--j)
				dp[d+1][j]=max(dp[d+1][j-a[i]]+c[i],dp[d+1][j]);
		for(int i=min(r,L-1);i>mid;i--)
			for(int j=m;j>=b[i];--j)
				dp[d+1][j]=max(dp[d+1][j-b[i]]+c[i],dp[d+1][j]);
		solve(d+1,l,mid,L,Mid);
	}
	if(mid<r)
	{
		for(int i=1;i<=m;++i) dp[d+1][i]=dp[d][i];
		for(int i=l;i<=mid;++i)
			for(int j=m;j>=a[i];--j)
				dp[d+1][j]=max(dp[d+1][j-a[i]]+c[i],dp[d+1][j]);
		for(int i=max(r+1,L);i<=Mid;++i)
			for(int j=m;j>=b[i];--j)
				dp[d+1][j]=max(dp[d+1][j-b[i]]+c[i],dp[d+1][j]);
		solve(d+1,mid+1,r,Mid+1,R);
	}
}
int main()
{
	read(n),read(m),read(K);
	for(int i=1;i<=n;++i)
		read(a[i]),read(b[i]),read(c[i]);
	solve(0,1,n,1,n+1);
	ll ans=0;
	for(int i=1;i<=n;++i) ans+=n-f[i]+1;
	printf("%lld\n",ans);
	return 0;
}
posted @ 2023-02-02 17:30  Meatherm  阅读(47)  评论(0)    收藏  举报