95pts求调
查看原帖
95pts求调
599287
_masppy_楼主2023/10/2 17:14
#include<bits/stdc++.h>
#define ll long long
#define lson pos<<1
#define rson pos<<1|1
using namespace std;
const int maxn=2e3+50;
const ll mod=1e9+7;
int n,m,t,ans=100,cnt=0;
int dp[maxn*20][maxn],dp1[maxn*20][maxn];
struct node{
	int a,b,siz,id;
}q[maxn*100];

int main(){
	scanf("%d",&n);
	
	for(int i=1;i<=n;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		int j=1;
		while(j<=z){
			//cout<<j<<endl;
			q[++cnt].a=x*j;
			q[cnt].b=y*j;
			q[cnt].siz=j;
			q[cnt].id=i;
			z-=j;
			j<<=1ll;	
		}
		if(z){
			q[++cnt].a=x*z;
			q[cnt].id=i;
			q[cnt].b=y*z;
			q[cnt].siz=z;
		}
	}
	
	for(int i=1;i<=cnt;i++){
		for(int j=0;j<=q[i].a;j++){
			dp[i][j]=dp[i-1][j];
		}
		for(int j=q[i].a;j<=1000;j++){
			dp[i][j]=max(dp[i-1][j],dp[i-1][j-q[i].a]+q[i].b);
		}
	}
	
	for(int i=cnt;i>=1;i--){
		for(int j=0;j<=q[i].a;j++){
			dp1[i][j]=dp1[i+1][j];
		}
		for(int j=q[i].a;j<=1000;j++){
			dp1[i][j]=max(dp1[i+1][j],dp1[i+1][j-q[i].a]+q[i].b);
		}
	}
	
	scanf("%d",&m);
	
	while(m--){
		int x,y;
		int ans=0;
		scanf("%d%d",&x,&y);
		x++;
		int l=0,r;
		while(q[l+1].id<x&&l<cnt) l++;
		r=l;
		while(q[r+1].id<=x&&r<cnt) r++;
		r++;
		for(int i=0;i<=y;i++){
			//cout<<i<<" "<<mp[x]<<" "<<mp[x+1]<<" "<<dp[mp[x]][i]<<" "<<dp[mp[x+1]+1][y-i]<<endl;
			ans=max(dp[l][i]+dp1[r][y-i],ans);
		}
		printf("%d\n",ans);
	}
	return 0;
}
2023/10/2 17:14
加载中...