1 条题解
-
0
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
- 上传者