示例#1
0
        public IEnumerable <string> Solve(int n, int[][] queries)
        {
            var treap = new ImplicitTreap(n);

            for (int i = 1; i <= n; i++)
            {
                treap.Add(i);
            }
            foreach (var query in queries)
            {
                if (query[0] == 1)
                {
                    var start = query[1] - 1;
                    var end   = query[2] - 1;
                    treap.Reverse(start, end);
                    reverseCnt++;
                }
                if (query[0] == 2)
                {
                    var elem = query[1];
                    var pos  = GetIdx(treap, elem, reverseCnt) + 1;
                    yield return($"element {elem} is at position {pos}");
                }
                if (query[0] == 3)
                {
                    var pos  = query[1] - 1;
                    var elem = treap[pos];
                    yield return($"element at position {pos} is {elem}");
                }
            }
        }
示例#2
0
        public List <int> Solve(IEnumerable <int> a, int[][] queries)
        {
            var treap = new ImplicitTreap(a.Count());

            foreach (var it in a)
            {
                treap.Add(it);
            }
            foreach (var query in queries)
            {
                var       l = query[1] - 1;
                var       r = query[2] - 1;
                TreapNode p1 = null, p2 = null, p3 = null;
                Split(treap.Root, r + 1, ref p2, ref p3);
                Split(p2, l, ref p1, ref p2);
                if (query[0] == 1)
                {
                    treap.Root = Merge(p2, Merge(p1, p3));
                }
                else
                {
                    treap.Root = Merge(p1, Merge(p3, p2));
                }
            }
            return(treap.ToList());
        }
示例#3
0
        public static int GetIdx(ImplicitTreap treap, int elem, int revCnt)
        {
            //todo : improve this, introduce caching.
            long idx = elem - 1;

            for (int i = 0; i < revCnt; i++)
            {
                idx = treap[(int)idx] - 1;
            }
            return((int)idx);
        }
示例#4
0
        public static IEnumerable <long> Solve(int[] a, IEnumerable <int[]> queries)
        {
            var treapCount = 2;
            var treaps     = new ImplicitTreap[treapCount];

            for (int i = 0; i < treapCount; i++)
            {
                treaps[i] = new ImplicitTreap(100000);
            }
            for (int i = 0; i < a.Length; i++)
            {
                treaps[i % treapCount].Add(a[i]);
            }
            foreach (var query in queries)
            {
                var l = query[1] - 1;
                var r = query[2] - 1;
                var t = query[0];

                var ql = new int[treapCount];
                var qr = new int[treapCount];
                for (int i = 0; i < treapCount; i++)
                {
                    if (l == r && l % 2 != i)
                    {
                        ql[i] = 0;
                        qr[i] = -1;
                    }
                    else
                    {
                        ql[i] = (l % 2 == i) ? l / 2 : (l + 1) / 2;
                        qr[i] = (r % 2 == i) ? r / 2 : (r - 1) / 2;
                    }
                }

                if (t == 1)
                {
                    TSwap(ref treaps[0], ql[0], qr[0], ref treaps[1], ql[1], qr[1]);
                }
                else
                {
                    long ans = 0;
                    for (int i = 0; i < treapCount; i++)
                    {
                        if (ql[i] <= qr[i])
                        {
                            ans += treaps[i].Sum(ql[i], qr[i]);
                        }
                    }
                    yield return(ans);
                }
            }
        }
示例#5
0
 public void Revert_and_Idx_Test()
 {
     for (int i = 0; i < 1000; i++)
     {
         var treap = new ImplicitTreap(4)
         {
             0, 1, 2
         };
         treap.Reverse(0, 2);
         Assert.Equal(2, treap.GetIdx(treap.Nodes.First()));
     }
 }
示例#6
0
        public static void TSwap(ref ImplicitTreap t1, int l1, int r1, ref ImplicitTreap t2, int l2, int r2)
        {
            TreapNode p1 = null, p2 = null, p3 = null, q1 = null, q2 = null, q3 = null;

            Split(t1.Root, r1 + 1, ref p2, ref p3);
            Split(p2, l1, ref p1, ref p2);

            Split(t2.Root, r2 + 1, ref q2, ref q3);
            Split(q2, l2, ref q1, ref q2);

            t1.Root = Merge(p1, Merge(q2, p3));
            t2.Root = Merge(q1, Merge(p2, q3));
        }
示例#7
0
        public void CrazyHelix_GetIdx_Test()
        {
            int n     = 500;
            var treap = new ImplicitTreap(n);

            for (int i = 1; i <= n; i++)
            {
                treap.Add(i);
            }
            var dic = treap.Nodes.ToDictionary(n => n.Value);

            for (int i = 1; i <= n; i++)
            {
                Assert.Equal(i - 1, treap.GetIdx(dic[i]));
            }
        }
示例#8
0
 public void CrazyHelix_Test0()
 {
     for (int i = 0; i < 1000; i++)
     {
         var treap = new ImplicitTreap(5)
         {
             1, 2, 3, 4, 5
         };
         var dic = treap.Nodes.ToDictionary(n => n.Value);
         treap.Reverse(0, 2);
         //var x = treap[0];
         if (treap.GetIdx(dic[3]) != 0)
         {
         }
         Assert.Equal(0, treap.GetIdx(dic[3]));
     }
 }
示例#9
0
        public void CrazyHelix_Test()
        {
            var treap = new ImplicitTreap(5)
            {
                1, 2, 3, 4, 5
            };

            treap.Reverse(2, 4);
            var dic = treap.Nodes.ToDictionary(n => n.Value);

            Assert.Equal(0, treap.GetIdx(dic[1]));
            Assert.Equal(3, treap.GetIdx(dic[4]));
            Assert.Equal(2, treap.GetIdx(dic[5]));
            Assert.Equal(1, treap.GetIdx(dic[2]));
            Assert.Equal(4, treap.GetIdx(dic[3]));

            treap.Reverse(1, 3);
            Assert.Equal(0, treap.GetIdx(dic[1]));
            Assert.Equal(1, treap.GetIdx(dic[4]));
            Assert.Equal(2, treap.GetIdx(dic[5]));
            Assert.Equal(3, treap.GetIdx(dic[2]));
            Assert.Equal(4, treap.GetIdx(dic[3]));
        }