Advertisement
Rajveer_100

Josephus Problem 2 CSES

Oct 3rd, 2021
1,430
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.25 KB | None | 0 0
  1. //
  2. //  main.cpp
  3. //  CPWorkSpace
  4. //
  5. //  Created by Rajveer Singh on 23/09/21.
  6. //
  7.  
  8. #include <iostream>
  9. #include <algorithm>
  10. #include <set>
  11. #include <unordered_set>
  12. #include <vector>
  13. #include <string>
  14. #include <time.h>
  15. #include <chrono>
  16. #include <array>
  17. #include <random>
  18. #include <ctime>
  19. #include <numeric>
  20. #include <iomanip>
  21. #include <queue>
  22. #include <map>
  23. #include <unordered_map>
  24. #include <numeric>
  25. #include <cstring>
  26.  
  27. //MARK:- PRACTICE
  28.  
  29. #define len(a) (ll)a.size()
  30. typedef long long ll;
  31. typedef long double ld;
  32.  
  33. bool test=false;
  34. ll mod1=1e9+7;
  35. ll mod2=998244353;
  36. ll inf=1e10+5;
  37.  
  38. enum colour {red, black};
  39.  
  40. struct Node {
  41.    
  42.     ll data, size;
  43.     bool colour;
  44.     Node *parent, *left, *right;
  45. };
  46.  
  47. class RBTree {
  48.    
  49.     Node *root, *tNil;
  50.    
  51.     Node* findNode(Node *z) {
  52.  
  53.         Node *x=this->root;
  54.        
  55.         while(x!=tNil) {
  56.                
  57.             if(x->data==z->data) {
  58.                
  59.                 return x;
  60.             } else if(z->data<x->data) {
  61.                
  62.                 x=x->left;
  63.             } else {
  64.                
  65.                 x=x->right;
  66.             }
  67.         }
  68.        
  69.         return tNil;
  70.     }
  71.  
  72.     Node* findMin(Node *z) {
  73.  
  74.         while(z->left!=tNil) {
  75.            
  76.             z=z->left;
  77.         }
  78.        
  79.         return z;
  80.     }
  81.    
  82.     void leftRotate(Node *x) {
  83.        
  84.         if(x->right==tNil) {
  85.            
  86.             return;
  87.         }
  88.        
  89.         Node *y=x->right;
  90.         x->right=y->left;
  91.        
  92.         if(y->left!=tNil) {
  93.            
  94.             y->left->parent=x;
  95.         }
  96.        
  97.         y->parent=x->parent;
  98.        
  99.         if(x->parent==tNil) {
  100.            
  101.             this->root=y;
  102.         } else if(x==x->parent->left) {
  103.            
  104.             x->parent->left=y;
  105.         } else {
  106.            
  107.             x->parent->right=y;
  108.         }
  109.        
  110.         y->left=x;
  111.         x->parent=y;
  112.         y->size=x->size;
  113.         x->size=x->left->size+x->right->size+1;
  114.     }
  115.    
  116.     void rightRotate(Node *y) {
  117.        
  118.         if(y->left==tNil) {
  119.            
  120.             return;
  121.         }
  122.        
  123.         Node *x=y->left;
  124.         y->left=x->right;
  125.        
  126.         if(x->right!=tNil) {
  127.            
  128.             x->right->parent=y;
  129.         }
  130.        
  131.         x->parent=y->parent;
  132.        
  133.         if(y->parent==tNil) {
  134.            
  135.             this->root=x;
  136.         } else if(y==y->parent->right) {
  137.            
  138.             y->parent->right=x;
  139.         } else {
  140.            
  141.             y->parent->left=x;
  142.         }
  143.        
  144.         x->right=y;
  145.         y->parent=x;
  146.         x->size=y->size;
  147.         y->size=y->left->size+y->right->size+1;
  148.     }
  149.    
  150.     void insertFixUp(Node *z) {
  151.        
  152.         while(z->parent->colour==red) {
  153.            
  154.             if(z->parent==z->parent->parent->left) {
  155.                
  156.                 Node *y=z->parent->parent->right;
  157.                
  158.                 if(y->colour==red) {
  159.                    
  160.                     z->parent->colour=black;
  161.                     y->colour=black;
  162.                    
  163.                     if(z->parent->parent!=this->root) {
  164.                        
  165.                         z->parent->parent->colour=red;
  166.                     }
  167.                     z=z->parent->parent;
  168.                 } else {
  169.                    
  170.                     if(z==z->parent->right) {
  171.                        
  172.                         z=z->parent;
  173.                         leftRotate(z);
  174.                     }
  175.                    
  176.                     z->parent->colour=black;
  177.                     z->parent->parent->colour=red;
  178.                     rightRotate(z->parent->parent);
  179.                 }
  180.             } else {
  181.                
  182.                 Node *y=z->parent->parent->left;
  183.                
  184.                 if(y->colour==red) {
  185.                    
  186.                     z->parent->colour=black;
  187.                     y->colour=black;
  188.                    
  189.                     if(z->parent->parent!=this->root) {
  190.                        
  191.                         z->parent->parent->colour=red;
  192.                     }
  193.                     z=z->parent->parent;
  194.                 } else {
  195.                    
  196.                     if(z==z->parent->left) {
  197.                        
  198.                         z=z->parent;
  199.                         rightRotate(z);
  200.                     }
  201.                    
  202.                     z->parent->colour=black;
  203.                     z->parent->parent->colour=red;
  204.                     leftRotate(z->parent->parent);
  205.                 }
  206.             }
  207.         }
  208.     }
  209.    
  210.     void insertNode(Node *z) {
  211.        
  212.         if(this->root==tNil) {
  213.            
  214.             z->colour=black;
  215.             this->root=z;
  216.             this->root->size=1;
  217.             return;
  218.         }
  219.        
  220.         Node *y=tNil, *x=this->root;
  221.        
  222.         while(x!=tNil) {
  223.            
  224.             y=x;
  225.             x->size++;
  226.            
  227.             if(z->data<x->data) {
  228.                
  229.                 x=x->left;
  230.             } else {
  231.                
  232.                 x=x->right;
  233.             }
  234.         }
  235.        
  236.         z->parent=y;
  237.        
  238.         if(z->data<y->data) {
  239.            
  240.             y->left=z;
  241.         } else {
  242.            
  243.             y->right=z;
  244.         }
  245.        
  246.         insertFixUp(z);
  247.     }
  248.    
  249.     void transplant(Node *u, Node *v) {
  250.        
  251.         if(u->parent==tNil) {
  252.            
  253.             this->root=v;
  254.         } else if(u==u->parent->left) {
  255.            
  256.             u->parent->left=v;
  257.         } else {
  258.            
  259.             u->parent->right=v;
  260.         }
  261.         v->parent=u->parent;
  262.     }
  263.    
  264.     void deleteFixUp(Node *x) {
  265.        
  266.         while(x!=this->root && x->colour==black) {
  267.            
  268.             if(x==x->parent->left) {
  269.                
  270.                 Node *w=x->parent->right;
  271.                
  272.                 if(w->colour==red) {
  273.                    
  274.                     w->colour=black;
  275.                     x->parent->colour=red;
  276.                     leftRotate(x->parent);
  277.                    
  278.                     w=x->parent->right;
  279.                 }
  280.                
  281.                 if(w->left->colour==black && w->right->colour==black) {
  282.                    
  283.                     w->colour=red;
  284.                     x=x->parent;
  285.                 } else {
  286.                    
  287.                     if(w->right->colour==black) {
  288.                        
  289.                         w->left->colour=black;
  290.                         w->colour=red;
  291.                         rightRotate(w);
  292.                        
  293.                         w=x->parent->right;
  294.                     }
  295.                    
  296.                     w->colour=x->parent->colour;
  297.                     x->parent->colour=red;
  298.                     w->right->colour=black;
  299.                     leftRotate(x->parent);
  300.                     x=this->root;
  301.                 }
  302.             } else {
  303.                
  304.                 Node *w=x->parent->left;
  305.                
  306.                 if(w->colour==red) {
  307.                    
  308.                     w->colour=black;
  309.                     x->parent->colour=red;
  310.                     rightRotate(x->parent);
  311.                    
  312.                     w=x->parent->left;
  313.                 }
  314.                
  315.                 if(w->right->colour==black && w->left->colour==black) {
  316.                    
  317.                     w->colour=red;
  318.                     x=x->parent;
  319.                 } else {
  320.                    
  321.                     if(w->left->colour==black) {
  322.                        
  323.                         w->right->colour=black;
  324.                         w->colour=red;
  325.                         leftRotate(w);
  326.                        
  327.                         w=x->parent->left;
  328.                     }
  329.                    
  330.                     w->colour=x->parent->colour;
  331.                     x->parent->colour=red;
  332.                     w->left->colour=black;
  333.                     rightRotate(x->parent);
  334.                     x=this->root;
  335.                 }
  336.             }
  337.         }
  338.         x->colour=black;
  339.     }
  340.    
  341.     void deleteNode(Node *z) {
  342.        
  343.         Node *y=z, *x;
  344.         bool originalColour=y->colour;
  345.        
  346.         if(z->left==tNil) {
  347.            
  348.             x=z->right;
  349.             transplant(z, z->right);
  350.         } else if(z->right==tNil) {
  351.            
  352.             x=z->left;
  353.             transplant(z, z->left);
  354.         } else {
  355.            
  356.             y=findMin(z->right);
  357.             originalColour=y->colour;
  358.            
  359.             x=y->right;
  360.            
  361.             if(y->parent==z) {
  362.                
  363.                 x->parent=y;
  364.             } else {
  365.                
  366.                 transplant(y, y->right);
  367.                 y->right=z->right;
  368.                 y->right->parent=y;
  369.                
  370.                 Node *s=x->parent;
  371.                
  372.                 while(s!=tNil && s!=y) {
  373.                    
  374.                     s->size--;
  375.                     s=s->parent;
  376.                 }
  377.             }
  378.            
  379.             transplant(z, y);
  380.            
  381.             y->left=z->left;
  382.             y->left->parent=y;
  383.             y->colour=z->colour;
  384.            
  385.             y->size=y->left->size+y->right->size+1;
  386.         }
  387.        
  388.         if(originalColour==black) {
  389.            
  390.             deleteFixUp(x);
  391.         }
  392.     }
  393.  
  394.     void inOrderHelper(Node *node) {
  395.        
  396.         if(node==tNil) {
  397.            
  398.             return;
  399.         }
  400.        
  401.         inOrderHelper(node->left);
  402.        
  403.         std::cout<<node->data<<" ";
  404.        
  405.         inOrderHelper(node->right);
  406.     }
  407.    
  408. public:
  409.    
  410.     RBTree() {
  411.        
  412.         tNil=new Node();
  413.         tNil->colour=black;
  414.         tNil->size=0;
  415.        
  416.         tNil->left=tNil;
  417.         tNil->right=tNil;
  418.         tNil->parent=tNil;
  419.        
  420.         this->root=tNil;
  421.     }
  422.    
  423.     Node* getRoot() {
  424.        
  425.         return this->root;
  426.     }
  427.    
  428.     Node* find(ll key) {
  429.  
  430.         Node *z=new Node();
  431.        
  432.         z->data=key;
  433.        
  434.         return findNode(z);
  435.     }
  436.    
  437.     void insert(ll key) {
  438.        
  439.         Node *z=new Node();
  440.         z->data=key;
  441.         z->colour=red;
  442.         z->size=1;
  443.        
  444.         z->left=tNil;
  445.         z->right=tNil;
  446.         z->parent=tNil;
  447.        
  448.         insertNode(z);
  449.     }
  450.    
  451.     void erase(ll key) {
  452.        
  453.         Node *z=find(key);
  454.        
  455.         if(z==tNil) {
  456.            
  457.             return;
  458.         }
  459.        
  460.         Node *s=z->parent;
  461.        
  462.         while(s!=tNil) {
  463.            
  464.             s->size--;
  465.             s=s->parent;
  466.         }
  467.        
  468.         deleteNode(z);
  469.     }
  470.    
  471.     ll osSelect(Node *x, ll i) {
  472.        
  473.         ll r=x->left->size+1;
  474.        
  475.         if(i==r) {
  476.            
  477.             return x->data;
  478.         } else if(i<r) {
  479.            
  480.             return osSelect(x->left, i);
  481.         } else {
  482.            
  483.             return osSelect(x->right, i-r);
  484.         }
  485.     }
  486.    
  487.     ll osRank(Node *x) {
  488.        
  489.         ll r=x->left->size+1;
  490.        
  491.         Node *y=x;
  492.        
  493.         while(y!=this->root) {
  494.            
  495.             if(y==y->parent->right) {
  496.                
  497.                 r+=y->parent->left->size+1;
  498.             }
  499.             y=y->parent;
  500.         }
  501.        
  502.         return r;
  503.     }
  504.        
  505.     void inOrder() {
  506.        
  507.         inOrderHelper(this->root);
  508.     }
  509. };
  510.  
  511. void testCase() {
  512.    
  513.     ll n, k;
  514.    
  515.     std::cin>>n>>k;
  516.    
  517.     RBTree t;
  518.    
  519.     for(int i=0;i<=n-1;i++) {
  520.        
  521.         t.insert(i+1);
  522.     }
  523.    
  524.     ll cur=k%n;
  525.    
  526.     while(n--) {
  527.        
  528.         ll val=t.osSelect(t.getRoot(), cur+1);
  529.        
  530.         std::cout<<val<<" ";
  531.        
  532.         t.erase(val);
  533.        
  534.         if(n) {
  535.            
  536.             cur=(cur%n+k)%n;
  537.         }
  538.     }
  539.    
  540.     std::cout<<"\n";
  541. }
  542.  
  543. int main() {
  544.    
  545.     std::ios_base::sync_with_stdio(false);
  546.     std::cin.tie(NULL);
  547.     std::cout.precision(15);
  548.    
  549.     ll t=1;
  550.    
  551.     if(test) {
  552.        
  553.         std::cin>>t;
  554.     }
  555.    
  556.     for(ll i=0;i<=t-1;i++) {
  557.        
  558. //        std::cout<<"Case #"<<i+1<<": ";
  559.         testCase();
  560.     }
  561. }
  562.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement