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
| #include <bits/stdc++.h> using namespace std; const int N=2000010; using ll=long long; int n,k,v[N],w[N],p[N]; vector<ll>a[301]; ll f[N],g[N]; int id(int i,int x,int mod){return (i-1)*mod+x;} void upd(int j,int i,int x,int mod){ int I=id(i,x,mod),J=id(j,x,mod),m=a[mod].size()-1; ll t=g[J]+a[mod][min(i-j,m)]; if(t>f[I])f[I]=t,p[I]=j; } void cdq(int l,int r,int x,int mod){ if(l+1>=r)return upd(r,r,x,mod); int mid=(l+r)>>1; int L=id(l,x,mod),R=id(r,x,mod); for(int i=p[L];i<=p[R];i++)upd(i,mid,x,mod); cdq(l,mid,x,mod); for(int i=l+1;i<=mid;i++)upd(i,r,x,mod); cdq(mid,r,x,mod); } int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=300;i++)a[i].push_back(0); for(int i=1;i<=n;i++)scanf("%d%d",w+i,v+i),a[w[i]].push_back(v[i]); for(int i=1;i<=300;i++){ int m=a[i].size()-1; sort(a[i].begin()+1,a[i].end(),greater<ll>()); for(int j=1;j<=m;j++)a[i][j]+=a[i][j-1]; } for(int i=1;i<=300;i++){ for(int j=0;j<=k;j++)g[j]=f[j],f[j]=0,p[j]=1; for(int j=0;j<i;j++){ int X=j,MOD=i; int M=(k-j)/i+1; if(M<=0)break; upd(1,1,X,MOD); upd(1,M,X,MOD); cdq(1,M,X,MOD); } } for(int i=1;i<=k;i++)printf("%lld ",f[i]); return 0; }
|