最后四个点RE是为什么啊?玄关
查看原帖
最后四个点RE是为什么啊?玄关
685167
0x7ffffycf楼主2023/11/10 16:01
#include<bits/stdc++.h>
using namespace std;
#define N 300005
#define int long long
#define re register
#define inl inline
#define rep(i,l,r) for(re int i=l;i<=r;i++)
template <typename T> inl T read(){
	T ret=0;bool p=1;char c=getchar();
	while(!isdigit(c)){if(c=='-') p=0;c=getchar();}
	while(isdigit(c)){ret=(ret<<3)+(ret<<1)+(c-'0');c=getchar();}
	if(p) return ret;
	else return ~(ret-1);
}
template <typename T>inl void write(T x){
	static int sta[50];int top=0;
	if(x<0){putchar('-');x=~(x-1);}
	while(x){
		sta[++top]=x%10;x/=10;
	}
	if(!top) sta[++top]=0;
	while(top){putchar(sta[top--]+'0');}
	putchar('\n');
	return;
}
struct node{
	int v,w,id;
}a[N];
int f[1005][1005],f2[1005][1005],n,m,tot;
int cn,V;
signed main(){
	cin>>n;
	int idx=0;
	for(int cw,cv,c,i=1;i<=n;i++){
		cw=read<int>();cv=read<int>();c=read<int>();
		int now=1;
		while(now<=c){
			a[++tot].w=cw*now,a[tot].v=cv*now;
            a[tot].id=i;
			c-=now,now*=2;
		}
		if(c){
			a[++tot].w=cw*c,a[tot].v=cv*c;
            a[tot].id=i;
		}
	}
	n=tot;
	cin>>m;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=1000;j++) f[i][j]=f[i-1][j];
		for(int j=1000;j>=a[i].w;--j){
			f[i][j]=max(f[i][j],f[i-1][j-a[i].w]+a[i].v);
		}
	}
	
	for(int i=n;i>=1;--i){
		for(int j=0;j<=1000;j++) f2[i][j]=f2[i+1][j];
		for(int j=1000;j>=a[i].w;--j){
			f2[i][j]=max(f2[i][j],f2[i+1][j-a[i].w]+a[i].v);
		}
	}
	
	for(int k=1;k<=m;k++){
		int ans=0;
		cn=read<int>()+1;V=read<int>();
		int l=0,r=0;
		while(a[l+1].id<cn&&l<n) l++;
		r=l;
		while(a[r+1].id==cn&&r<n) r++;
		for(int j=0;j<=V;j++){
			ans=max(ans,f[l][j]+f2[r+1][V-j]);
		}
		write(ans);
	}
	
	return 0;
}
2023/11/10 16:01
加载中...