Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ShuffleCustomNode
- {
- class Program
- {
- static void Main(string[] args)
- {
- var cmd = Console.ReadLine().Split().Select(x => int.Parse(x)).ToArray();
- var n = cmd[0];
- var shufles = Console.ReadLine().Split().Select(x => int.Parse(x)).ToArray();
- var nodes = Enumerable.Range(0, n + 1).Select(x => new Node(x)).ToArray();
- for (int i = 1; i < nodes.Length - 1; i++)
- {
- nodes[i].Connect(nodes[i + 1]);
- }
- var head = nodes[1];
- foreach (var shufle in shufles)
- {
- var numberToFind = 0;
- if (shufle % 2 != 0)
- {
- if ((shufle * 2 >= n))
- {
- numberToFind = n;
- }
- else
- {
- numberToFind = shufle * 2;
- }
- Node nodeToFind = nodes[numberToFind];
- if (numberToFind == n && shufle == n)
- {
- continue;
- }
- var nodeToShuffle = nodes[shufle];
- if (nodeToShuffle.Left != null && nodeToShuffle.Right != null)
- {
- var prev = nodeToShuffle.Left;
- var next = nodeToShuffle.Right;
- nodeToShuffle.Disconnect();
- prev.Connect(next);
- var nodeToFindNodePrev = nodeToFind.Left;
- var nodeToFindNodeNext = nodeToFind.Right;
- nodeToFind.Connect(nodeToShuffle);
- if (nodeToFindNodeNext != null)
- {
- nodeToShuffle.Connect(nodeToFindNodeNext);
- }
- }
- if (nodeToShuffle.Left == null)
- {
- var next = nodeToShuffle.Right;
- nodeToShuffle.Disconnect();
- head = next;
- if (nodeToFind.Right != null)
- {
- var nodeToFindNodeNext = nodeToFind.Right;
- nodeToFind.Connect(nodeToShuffle);
- nodeToShuffle.Connect(nodeToFindNodeNext);
- }
- else
- {
- nodeToFind.Connect(nodeToShuffle);
- }
- }
- if (nodeToShuffle.Right == null)
- {
- nodeToShuffle.Disconnect();
- if (nodeToFind.Right != null)
- {
- var nodeToFindNodeNext = nodeToFind.Right;
- nodeToFind.Connect(nodeToShuffle);
- nodeToShuffle.Connect(nodeToFindNodeNext);
- }
- else
- {
- nodeToFind.Connect(nodeToShuffle);
- }
- }
- }
- else
- {
- numberToFind = shufle / 2;
- Node nodeToFind = nodes[numberToFind];
- if (numberToFind == n && shufle == n)
- {
- continue;
- }
- var nodeToShuffle = nodes[shufle];
- if (nodeToShuffle.Left != null && nodeToShuffle.Right != null)
- {
- var prev = nodeToShuffle.Left;
- var next = nodeToShuffle.Right;
- nodeToShuffle.Disconnect();
- prev.Connect(next);
- var nodeToFindNodePrev = nodeToFind.Left;
- var nodeToFindNodeNext = nodeToFind.Right;
- nodeToFind.Connect(nodeToShuffle);
- if (nodeToFindNodeNext != null)
- {
- nodeToShuffle.Connect(nodeToFindNodeNext);
- }
- }
- if (nodeToShuffle.Left == null)
- {
- var next = nodeToShuffle.Right;
- nodeToShuffle.Disconnect();
- head = next;
- if (nodeToFind.Right != null)
- {
- var nodeToFindNodeNext = nodeToFind.Right;
- nodeToFind.Connect(nodeToShuffle);
- nodeToShuffle.Connect(nodeToFindNodeNext);
- }
- else
- {
- nodeToFind.Connect(nodeToShuffle);
- }
- }
- if (nodeToShuffle.Right == null)
- {
- nodeToShuffle.Disconnect();
- if (nodeToFind.Right != null)
- {
- var nodeToFindNodeNext = nodeToFind.Right;
- nodeToFind.Connect(nodeToShuffle);
- nodeToShuffle.Connect(nodeToFindNodeNext);
- }
- else
- {
- nodeToFind.Connect(nodeToShuffle);
- }
- }
- }
- }
- Console.WriteLine(string.Join(" ", head));
- }
- }
- internal class Node : IEnumerable<int>
- {
- public Node(int num)
- {
- this.Value = num;
- this.Right = null;
- this.Left = null;
- }
- public int Value { get; set; }
- public Node Right { get; set; }
- public Node Left { get; set; }
- public void Connect(Node node)
- {
- if (node != null)
- {
- this.Right = node;
- }
- if (this != null)
- {
- node.Left = this;
- }
- }
- public void Disconnect()
- {
- if (this.Right != null)
- {
- this.Right.Left = null;
- }
- if (this.Left != null)
- {
- this.Left.Right = null;
- }
- this.Right = null;
- this.Left = null;
- }
- public IEnumerator<int> GetEnumerator()
- {
- var node = this;
- while (node != null)
- {
- yield return node.Value;
- node = node.Right;
- }
- }
- IEnumerator IEnumerable.GetEnumerator()
- {
- return GetEnumerator();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment