Viacheslav

Shuffles

Feb 21st, 2018
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.29 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace ShuffleCustomNode
  9. {
  10.     class Program
  11.     {
  12.         static void Main(string[] args)
  13.         {
  14.             var cmd = Console.ReadLine().Split().Select(x => int.Parse(x)).ToArray();
  15.             var n = cmd[0];
  16.             var shufles = Console.ReadLine().Split().Select(x => int.Parse(x)).ToArray();
  17.  
  18.             var nodes = Enumerable.Range(0, n + 1).Select(x => new Node(x)).ToArray();
  19.  
  20.             for (int i = 1; i < nodes.Length - 1; i++)
  21.             {
  22.                 nodes[i].Connect(nodes[i + 1]);
  23.  
  24.             }
  25.             var head = nodes[1];
  26.  
  27.             foreach (var shufle in shufles)
  28.             {
  29.                 var numberToFind = 0;
  30.                 if (shufle % 2 != 0)
  31.                 {
  32.                    
  33.                     if ((shufle * 2 >= n))
  34.                     {
  35.                         numberToFind = n;
  36.                     }
  37.                     else
  38.                     {
  39.                         numberToFind = shufle * 2;
  40.                     }
  41.                     Node nodeToFind = nodes[numberToFind];
  42.                     if (numberToFind == n && shufle == n)
  43.                     {
  44.                         continue;
  45.                     }
  46.                         var nodeToShuffle = nodes[shufle];
  47.                         if (nodeToShuffle.Left != null && nodeToShuffle.Right != null)
  48.                         {
  49.                             var prev = nodeToShuffle.Left;
  50.                             var next = nodeToShuffle.Right;
  51.                             nodeToShuffle.Disconnect();
  52.                             prev.Connect(next);
  53.                             var nodeToFindNodePrev = nodeToFind.Left;
  54.                             var nodeToFindNodeNext = nodeToFind.Right;
  55.                             nodeToFind.Connect(nodeToShuffle);
  56.                         if (nodeToFindNodeNext != null)
  57.                         {
  58.                             nodeToShuffle.Connect(nodeToFindNodeNext);
  59.  
  60.                         }
  61.                     }
  62.                         if (nodeToShuffle.Left == null)
  63.                         {
  64.                             var next = nodeToShuffle.Right;
  65.                             nodeToShuffle.Disconnect();
  66.                             head = next;
  67.                             if (nodeToFind.Right != null)
  68.                             {
  69.                                 var nodeToFindNodeNext = nodeToFind.Right;
  70.                                 nodeToFind.Connect(nodeToShuffle);
  71.                                 nodeToShuffle.Connect(nodeToFindNodeNext);
  72.                             }
  73.                             else
  74.                             {
  75.                                 nodeToFind.Connect(nodeToShuffle);
  76.                             }
  77.                         }
  78.                     if (nodeToShuffle.Right == null)
  79.                     {
  80.  
  81.                         nodeToShuffle.Disconnect();
  82.  
  83.                         if (nodeToFind.Right != null)
  84.                         {
  85.                             var nodeToFindNodeNext = nodeToFind.Right;
  86.                             nodeToFind.Connect(nodeToShuffle);
  87.                             nodeToShuffle.Connect(nodeToFindNodeNext);
  88.                         }
  89.                         else
  90.                         {
  91.                             nodeToFind.Connect(nodeToShuffle);
  92.                         }
  93.                     }
  94.                 }
  95.                 else
  96.                 {
  97.                     numberToFind = shufle / 2;
  98.                     Node nodeToFind = nodes[numberToFind];
  99.                     if (numberToFind == n && shufle == n)
  100.                     {
  101.                         continue;
  102.                     }
  103.                     var nodeToShuffle = nodes[shufle];
  104.                     if (nodeToShuffle.Left != null && nodeToShuffle.Right != null)
  105.                     {
  106.                         var prev = nodeToShuffle.Left;
  107.                         var next = nodeToShuffle.Right;
  108.                         nodeToShuffle.Disconnect();
  109.                         prev.Connect(next);
  110.                         var nodeToFindNodePrev = nodeToFind.Left;
  111.                         var nodeToFindNodeNext = nodeToFind.Right;
  112.                         nodeToFind.Connect(nodeToShuffle);
  113.                         if (nodeToFindNodeNext != null)
  114.                         {
  115.                             nodeToShuffle.Connect(nodeToFindNodeNext);
  116.  
  117.                         }
  118.                        
  119.                     }
  120.                     if (nodeToShuffle.Left == null)
  121.                     {
  122.                         var next = nodeToShuffle.Right;
  123.                         nodeToShuffle.Disconnect();
  124.                         head = next;
  125.                         if (nodeToFind.Right != null)
  126.                         {
  127.                             var nodeToFindNodeNext = nodeToFind.Right;
  128.                             nodeToFind.Connect(nodeToShuffle);
  129.                             nodeToShuffle.Connect(nodeToFindNodeNext);
  130.                         }
  131.                         else
  132.                         {
  133.                             nodeToFind.Connect(nodeToShuffle);
  134.                         }
  135.                     }
  136.                     if (nodeToShuffle.Right == null)
  137.                     {
  138.                        
  139.                         nodeToShuffle.Disconnect();
  140.                        
  141.                         if (nodeToFind.Right != null)
  142.                         {
  143.                             var nodeToFindNodeNext = nodeToFind.Right;
  144.                             nodeToFind.Connect(nodeToShuffle);
  145.                             nodeToShuffle.Connect(nodeToFindNodeNext);
  146.                         }
  147.                         else
  148.                         {
  149.                             nodeToFind.Connect(nodeToShuffle);
  150.                         }
  151.                     }
  152.                 }
  153.             }
  154.             Console.WriteLine(string.Join(" ", head));
  155.         }
  156.     }
  157.     internal class Node : IEnumerable<int>
  158.     {
  159.  
  160.  
  161.  
  162.         public Node(int num)
  163.         {
  164.             this.Value = num;
  165.             this.Right = null;
  166.             this.Left = null;
  167.         }
  168.  
  169.         public int Value { get; set; }
  170.         public Node Right { get; set; }
  171.         public Node Left { get; set; }
  172.  
  173.         public void Connect(Node node)
  174.         {
  175.             if (node != null)
  176.             {
  177.                 this.Right = node;
  178.             }
  179.             if (this != null)
  180.             {
  181.                 node.Left = this;
  182.             }
  183.         }
  184.         public void Disconnect()
  185.         {
  186.             if (this.Right != null)
  187.             {
  188.                 this.Right.Left = null;
  189.             }
  190.             if (this.Left != null)
  191.             {
  192.                 this.Left.Right = null;
  193.             }
  194.             this.Right = null;
  195.             this.Left = null;
  196.         }
  197.  
  198.         public IEnumerator<int> GetEnumerator()
  199.         {
  200.             var node = this;
  201.             while (node != null)
  202.             {
  203.                 yield return node.Value;
  204.                 node = node.Right;
  205.             }
  206.  
  207.         }
  208.  
  209.         IEnumerator IEnumerable.GetEnumerator()
  210.         {
  211.             return GetEnumerator();
  212.         }
  213.     }
  214. }
Advertisement
Add Comment
Please, Sign In to add comment