Advertisement
The5threic1-1

Generator - BinCoin

Feb 7th, 2024
186
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.51 KB | Source Code | 0 0
  1. #include<bits/stdc++.h>
  2. #define endl '\n'
  3. using namespace std;
  4. mt19937_64 gen(chrono::steady_clock::now().time_since_epoch().count());
  5. struct node
  6. {
  7.     int val = -1;
  8.     int child[2] = {-1, -1};   
  9. };
  10. vector<node> tri;
  11. int dfs_rand(int node)
  12. {
  13.     if(tri[node].child[0]==-1)
  14.     {
  15.         cout<<tri[node].val<<" ";
  16.         return 0;
  17.     }
  18.         uniform_int_distribution<int> rnd(0,1);
  19.     int goi = rnd(gen);
  20.     dfs_rand(tri[node].child[goi]);
  21.     cout<<tri[node].val<<" ";
  22.     dfs_rand(tri[node].child[goi^1]);
  23.     return 0;
  24. }
  25. int main()
  26. {
  27.     ios::sync_with_stdio(false);
  28.     cin.tie(0);
  29.     int n, k;
  30.     cin>>n>>k;
  31.     int shuff[n+1];
  32.     for(int i=0; i<=n; i++)
  33.     {
  34.         shuff[i] = i;
  35.     }
  36.     for(int i=1; i<=n; i++)
  37.     {
  38.         uniform_int_distribution<int> rnd(1,n);
  39.         swap(shuff[i], shuff[rnd(gen)]);       
  40.     }
  41.     tri.clear(); tri.push_back(node());
  42.     tri[0].val = shuff[1];
  43.     vector<int> childless; childless.push_back(0);
  44.     while((int)tri.size()<n)
  45.     {
  46.         uniform_int_distribution<int> rnd(0,(int)childless.size()-1);
  47.         for(int i=0; i<(int)childless.size(); i++)
  48.         {
  49.             swap(childless[i], childless[rnd(gen)]);   
  50.         }
  51.         int expan = childless.back();
  52.         node add_1, add_2;
  53.        
  54.         tri[expan].child[0] = tri.size(); tri[expan].child[1] = tri.size()+1;
  55.  
  56.         childless.pop_back();
  57.  
  58.         childless.push_back(tri.size()); childless.push_back(tri.size()+1);
  59.  
  60.         add_1.val = shuff[tri.size()+1]; tri.push_back(add_1);
  61.         add_2.val = shuff[tri.size()+1]; tri.push_back(add_2);     
  62.     }
  63.     cout<<n<<" "<<k<<endl;
  64.     for(int i=0; i<k; i++)
  65.     {
  66.         dfs_rand(0);
  67.         cout<<endl;
  68.     }
  69.     return 0;  
  70. }
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement