1 条题解

  • 0
    @ 2023-6-21 20:01:56

    C++ :

    #include<cstdio>
    #include<algorithm>
    #define ull unsigned long long
    const int inf=1<<30;
    int n,m,mc,a[110],w[110],C[1010],maxc,f[110][110],add[110],cnt;
    int min(int a,int b){return a<b?a:b;}
    void cmax(int&a,int b){b>a?a=b:1;}
    struct item{
    	int i,x,d;
    	bool operator<(const item&it)const{return x<it.x;}
    }Q[7840010],*H=Q,*T=Q,S[930000];
    ull vis[8110000];
    void ext(int i,int x,int d){
    	int c=add[i]+x;
    	if(!(vis[c>>6]>>(c&63)&1))vis[c>>6]|=1ull<<(c&63),*(T++)=(item){i,i*x,d};
    }
    int pmax[930000];
    void init(int lim,int tot){
    	for(int i=1;i<tot;i++)add[i+1]=add[i]+lim/i;
    	ext(2,1,3);
    	for(;H<T;H++){
    		int jmax=lim/H->x;
    		if(jmax>H->i)jmax=H->i;
    		if(H->i<tot&&H->i==H->x)ext(H->i+1,1,H->d+1);
    		if(H->i>1)for(int j=1;j<=jmax;j++)ext(j,H->x,H->d+1);
    		else S[cnt++]=*H;
    	}
    	S[cnt++]=(item){1,1,1};
    	std::sort(S,S+cnt);
    	*pmax=-inf;
    	for(int i=0;i<cnt;i++)cmax(pmax[i+1]=S[i].x-S[i].d,pmax[i]);
    }
    int check(int t,int c){
    	if(c<=t)return 1;
    	for(int i=cnt,j=0;i--;)if(S[i].x<=c){
    		while(j<cnt&&S[i].x+S[j].x<=c)j++;
    		if(c-S[i].x<=t-S[i].d||c-S[i].x+S[i].d<=t+pmax[j])return 1;
    	}
    	return 0;
    }
    int main(){
    	scanf("%d%d%d",&n,&m,&mc);
    	for(int i=0;i<n;i++)scanf("%d",a+i);
    	for(int i=0;i<n;i++)scanf("%d",w+i);
    	for(int i=0;i<m;i++)scanf("%d",C+i),cmax(maxc,C[i]);
    	for(int i=0;i<=n;i++)for(int j=0;j<=mc;j++)f[i][j]=-inf;
    	int t=f[0][mc]=0;
    	for(int i=0;i<n;i++)for(int j=0;j<=mc;j++)if(f[i][j]>=0&&j-a[i]>=0){
    		cmax(f[i+1][j-a[i]],f[i][j]+1);
    		cmax(f[i+1][min(j-a[i]+w[i],mc)],f[i][j]);
    	}
    	for(int i=1;i<=n;i++)for(int j=0;j<=mc;j++)cmax(t,f[i][j]);
    	init(maxc,t);
    	for(int i=0;i<m;i++)printf("%d\n",check(t,C[i]));
    }
    
    • 1

    信息

    ID
    1021
    时间
    3000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者