binh27112004

SKYSCRAPER

Apr 30th, 2020
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.73 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define maxn 25
  5. #define pb push_back
  6. #define reset(a,gt,n) memset(a,gt,n*4+4)
  7.  
  8. int i,j,n,m,k;
  9. int vc=1e9;
  10. int a[maxn],w;
  11. struct ii
  12. {
  13. int gt,du;
  14. };
  15. ii f[500005];
  16. int tv[500005];
  17.  
  18. vector <int> pos[25];
  19.  
  20. void nhap()
  21. {
  22. ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  23. freopen("skyscraper.inp","r",stdin);
  24. freopen("skyscraper.out","w",stdout);
  25. cin>>n>>w;
  26. for(int i=1;i<=n;i++) cin>>a[i];
  27. }
  28.  
  29. int get(int s)
  30. {
  31. return (1<<s);
  32. }
  33.  
  34. void solve(int s)
  35. {
  36. for(int i=1;i<=n;i++)
  37. {
  38. int tam=(s^get(i-1));
  39. if(tam<s)
  40. {
  41. if(a[i]+f[tam].du<=w)
  42. {
  43. if( f[s].gt > f[tam].gt || ( f[s].gt==f[tam].gt && f[s].du > f[tam].du+a[i] ) )
  44. {
  45. f[s].gt=f[tam].gt; f[s].du=f[tam].du+a[i];
  46. tv[s]=i;
  47. }
  48. }
  49. else
  50. {
  51. if(f[s].gt > f[tam].gt+1 || ( f[s].gt==f[tam].gt+1 && f[s].du > a[i] ) )
  52. {
  53. f[s].gt=f[tam].gt+1; f[s].du=a[i];
  54. tv[s]=i;
  55. }
  56. }
  57. }
  58. }
  59. }
  60.  
  61. void xuli()
  62. {
  63. f[0]={0,vc};
  64. for(int i=1;i<get(n);i++)
  65. {
  66. f[i]={vc,vc};
  67. solve(i);
  68. }
  69. cout<<f[get(n)-1].gt<<endl;
  70.  
  71. int u=get(n)-1;
  72. while(true)
  73. {
  74. if(u==0) break;
  75. int res=tv[u];
  76. pos[f[u].gt].pb(res);
  77. u=u^get(res-1);
  78. }
  79.  
  80.  
  81. for(int i=1;i<= f[get(n)-1].gt ;i++)
  82. {
  83. cout<<pos[i].size()<<' ';
  84. for( int v : pos[i] ) cout<<v<<' ';
  85. cout<<endl;
  86. }
  87. }
  88.  
  89. int main()
  90. {
  91. nhap();
  92. xuli();
  93. }
Add Comment
Please, Sign In to add comment