Exemple #1
0
        public void TestFindLeft()
        {
            var array    = new[] { 5, 7, 10, 12, 19, 20 };
            var position = BinarySearchHelper.Search(array, 0, array.Length, 7);

            Assert.AreEqual(1, position);
        }
Exemple #2
0
        public void TestFindLessWithStart2()
        {
            var array = new[] { -9, 1, 2 };
            var less  = BinarySearchHelper.FindLess(array, -9, 2, 3);

            Assert.AreEqual(0, less);
        }
Exemple #3
0
        public void TestFindLessOrEqualWithStart()
        {
            var array = new[] { 9, 28, 44, 47, 47, 47, 90 };
            var less  = BinarySearchHelper.FindLessOrEqual(array, 47, 4);

            Assert.AreEqual(2, less);
        }
        public static PointInt[] Solve(int N, int[][] commands, long[] K)
        {
            var squares = new SquareInfo[commands.Length + 1];

            squares[0] = new SquareInfo {
                Row = 0, Col = 0, Width = N, First = 0, DeltaInRow = 1, DeltaInCol = N, Direction = 0
            };
            squares[0].CalcExtra(N);
            for (var i = 1; i <= commands.Length; i++)
            {
                var command = commands[i - 1];
                var ai      = command[0];
                var bi      = command[1];
                var di      = command[2];

                var prev = squares[i - 1];

                var newRow = ai - 1;
                var newCol = bi - 1;

                var square = new SquareInfo
                {
                    Row        = newRow,
                    Col        = newCol,
                    Width      = di + 1,
                    First      = prev.First + (newCol - prev.Col) * prev.DeltaInRow + (newRow - prev.Row + di) * prev.DeltaInCol,
                    DeltaInRow = -prev.DeltaInCol,
                    DeltaInCol = prev.DeltaInRow,
                    Direction  = i % 4,
                };
                square.CalcExtra(N);
                squares[i] = square;
            }

            var result = new PointInt[K.Length];

            for (var i = 0; i < K.Length; i++)
            {
                var wi = K[i];

                var si = BinarySearchHelper.BinarySearchRightBiased(squares, sq =>
                {
                    var rem = wi % N;
                    var div = wi / N;

                    var contains = sq.MinRem <= rem && rem <= sq.MaxRem && sq.MinDiv <= div && div <= sq.MaxDiv;

                    return(contains ? 0 : 1);
                });

                result[i] = GetPoint(squares[si], wi, N);
            }
            return(result);
        }
Exemple #5
0
 protected override void Merge(int[] array, int[] arrayResult, int start, int pivot, int end)
 {
     Parallel.Invoke(() => Parallel.ForEach(Enumerable.Range(start, pivot - start), index =>
     {
         var value = array[index];
         var less  = BinarySearchHelper.FindLess(array, value, pivot, end);
         arrayResult[index + less] = value;
     }),
                     () => Parallel.ForEach(Enumerable.Range(pivot, end - pivot), index =>
     {
         var value = array[index];
         var less  = BinarySearchHelper.FindLessOrEqual(array, value, start, pivot);
         arrayResult[start + index - pivot + less] = value;
     }));
 }
Exemple #6
0
        protected override void Merge(int[] array, int[] arrayResult, int start, int pivot, int end)
        {
            // collect separate action arrays for each individual operation
            var firstPart = Enumerable.Range(start, pivot - start).Select(index => new Action(() =>
            {
                var value = array[index];
                var less  = BinarySearchHelper.FindLess(array, value, pivot, end);
                arrayResult[index + less] = value;
            }));

            var secondPart = Enumerable.Range(pivot, end - pivot).Select(index => new Action(() =>
            {
                var value = array[index];
                var less  = BinarySearchHelper.FindLessOrEqual(array, value, start, pivot);
                arrayResult[start + index - pivot + less] = value;
            }));

            // combine into 4 big actions
            var actions = new Action[4];
            var i       = 0;

            foreach (var action in firstPart)
            {
                actions[i] += action;
                i++;
                if (i == actions.Length)
                {
                    i = 0;
                }
            }
            foreach (var action in secondPart)
            {
                actions[i] += action;
                i++;
                if (i == actions.Length)
                {
                    i = 0;
                }
            }
            ThreadPoolHelper.SpawnAndWait(actions);
        }
Exemple #7
0
 public OperationAdapter()
 {
     sortTarget   = new QuickSortHelper();
     searchTarget = new BinarySearchHelper();
 }
 public void Test1()
 {            
     var res = BinarySearchHelper.BinarySearch(new[] {1, 2, 4, 5}, 3, null);
     Assert.Equal(~2, res);
 }
 public void Test3()
 {
     var res = BinarySearchHelper.BinarySearch(new[] { 1, 2, 2, 3 }, 1, null);
     Assert.InRange(res, 0, 1);            
 }
Exemple #10
0
        public void TestFindLess2(int[] array, int value, int expected)
        {
            var position = BinarySearchHelper.FindLessOrEqual(array, value);

            Assert.AreEqual(expected, position);
        }
        public static int Solve(string s)
        {
            var N = s.Length;

            var opt = N / 4;

            var lefts = new int[N + 1][];

            lefts[0] = new int[4];
            for (var i = 1; i <= N; i++)
            {
                var c      = s[i - 1];
                var counts = new int[4];
                for (var d = 0; d < 4; d++)
                {
                    counts[d] = lefts[i - 1][d];
                }
                counts[c == 'A' ? 0 : c == 'C' ? 1 : c == 'T' ? 2 : 3]++;
                lefts[i] = counts;
            }

            if (lefts[N].Sum(c => Math.Abs(c - opt)) == 0)
            {
                return(0);
            }

            var rights = new int[N + 1][];

            rights[N] = new int[4];
            for (var j = N - 1; j >= 0; j--)
            {
                var c      = s[j];
                var counts = new int[4];
                for (var d = 0; d < 4; d++)
                {
                    counts[d] = j == N - 1 ? 0 : rights[j + 1][d];
                }
                counts[c == 'A' ? 0 : c == 'C' ? 1 : c == 'T' ? 2 : 3]++;
                rights[j] = counts;
            }

            var best = int.MaxValue;

            for (var j = N; j >= 0; j--)
            {
                var right = rights[j];

                var bestI = BinarySearchHelper.BinarySearchLeftBiased(lefts, counts => - Distance(right, counts, opt));

                var distanceHere = Distance(right, lefts[bestI], opt);

                if (distanceHere < 0 || bestI >= j)
                {
                    continue;
                }

                if (bestI >= 0)
                {
                    best = Math.Min(best, j - bestI);
                }
            }

            return(best);
        }