fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct woa
  4. {
  5. long long t,sl1,sl2;
  6. };
  7. long long a,b,n,to;vector<long long>vt1,vt2;woa f[500005];
  8. int main()
  9. {
  10. ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  11. //freopen("knapsack.inp","r",stdin);
  12. //freopen("knapsack.out","w",stdout);
  13. cin>>n;
  14. for(int i=1;i<=n;i++)
  15. {
  16. cin>>a>>b;
  17. if(a==1)vt1.push_back(b);
  18. else vt2.push_back(b);
  19. to+=a;
  20. }
  21. sort(vt1.begin(),vt1.end());
  22. sort(vt2.begin(),vt2.end());
  23. f[0].t=0;
  24. f[0].sl1=vt1.size()-1;
  25. f[0].sl2=vt2.size()-1;
  26. f[1].sl1=f[0].sl1;
  27. f[1].sl2=f[0].sl2;
  28. if(f[0].sl1>=0)
  29. {
  30. f[1].t=vt1[f[0].sl1];
  31. f[1].sl1--;
  32. }
  33. for(int i=2;i<=to;i++)
  34. {
  35. f[i].t=f[i-1].t;
  36. f[i].sl1=f[i-1].sl1;
  37. f[i].sl2=f[i-1].sl2;
  38. if(f[i-1].sl1>=0&&f[i-1].t+vt1[f[i-1].sl1]>f[i].t)
  39. {
  40. f[i].t=f[i-1].t+vt1[f[i-1].sl1];
  41. f[i].sl1=f[i-1].sl1-1;
  42. f[i].sl2=f[i-1].sl2;
  43. }
  44. if(f[i-2].sl2>=0&&f[i-2].t+vt2[f[i-2].sl2]>f[i].t)
  45. {
  46. f[i].t=f[i-2].t+vt2[f[i-2].sl2];
  47. f[i].sl1=f[i-2].sl1;
  48. f[i].sl2=f[i-2].sl2-1;
  49. }
  50. }
  51. for(int i=1;i<=to;i++)cout<<f[i].t<<' ';
  52. return 0;
  53. }
  54.  
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Standard output is empty