1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include<bits/stdc++.h> #define maxn 1005 #define ll long long #define put() putchar('\n') using namespace std; inline void read(int &x){ int f=1;x=0;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} x*=f; } int n; struct yyy{ int v,w,k; }a[1005]; int f[1005][1005],g[1005][1005]; int head,tail,q[1005],m=1000; int suf[maxn],suff[maxn]; signed main(void){ freopen("1.in","r",stdin); int i,j,k,T,x,y; read(n); for (i=1;i<=n;i++) read(a[i].v),read(a[i].w),read(a[i].k); for (i=1;i<=n;i++) { for (j=0;j<a[i].v;j++) { q[head=tail=1]=0; f[i][j]=f[i-1][j]; for (k=1;k*a[i].v+j<=m;k++) { while (head<=tail&&q[head]+a[i].k<k) head++; while (head<=tail&&f[i-1][j+q[tail]*a[i].v]-q[tail]*a[i].w<=f[i-1][j+k*a[i].v]-k*a[i].w) tail--; q[++tail]=k; f[i][j+k*a[i].v]=f[i-1][j+q[head]*a[i].v]+(k-q[head])*a[i].w; } } } for (i=n;i>=1;i--) { for (j=0;j<a[i].v;j++) { q[head=tail=1]=0; g[i][j]=g[i+1][j]; for (k=1;k*a[i].v+j<=m;k++) { while (head<=tail&&q[head]+a[i].k<k) head++; while (head<=tail&&g[i+1][j+q[tail]*a[i].v]-q[tail]*a[i].w<=g[i+1][j+k*a[i].v]-k*a[i].w) tail--; q[++tail]=k; g[i][j+k*a[i].v]=g[i+1][j+q[head]*a[i].v]+(k-q[head])*a[i].w; } } } read(T); while (T--){ read(x);read(y);x++; int ans=0; for (i=0;i<=y;i++) suf[i]=max(suf[i-1],f[x-1][i]),suff[i]=max(suff[i-1],g[x+1][i]); for (i=0;i<=y;i++) ans=max(ans,suf[i]+suff[y-i]); printf("%d\n",ans); } return 0; }
|