コード例 #1
0
        private void SegmentTreeUpdate <TQueryObject>(SegmentTreeMode segmentTreeMode, ArrayMode arrayMode, bool randomPoints = false)
            where TQueryObject : SegmentTreeQueryObject <TQueryObject, int>, new()
        {
            int updater(int x) => x + 1;

            var array = arrayMode == ArrayMode.AllRanges ? _allRangesArray
                : _randomRangesArray;
            var segmentTree = segmentTreeMode == SegmentTreeMode.NodeBased ? new NodeBasedSegmentTree <TQueryObject, int>(array)
                : segmentTreeMode == SegmentTreeMode.ArrayBased ? new ArrayBasedSegmentTree <TQueryObject, int>(array)
                : (SegmentTree <TQueryObject, int>) new NonRecursiveSegmentTree <TQueryObject, int>(array);

            if (arrayMode == ArrayMode.AllRanges)
            {
                for (int i = 0; i < array.Count; ++i)
                {
                    for (int j = i; j < array.Count; ++j)
                    {
                        segmentTree.Update(i, j, updater);
                    }
                }
            }
            else
            {
                if (randomPoints)
                {
                    for (int i = 0; i < _randomRangesCount; ++i)
                    {
                        Tuple <int, int> range = _randomRanges[i];

                        segmentTree.Update(range.Item1, updater);
                    }
                }
                else
                {
                    for (int i = 0; i < _randomRangesCount; ++i)
                    {
                        Tuple <int, int> range = _randomRanges[i];

                        segmentTree.Update(range.Item1, range.Item2, updater);
                    }
                }
            }
        }
コード例 #2
0
        private void SegmentTreeSumRandomOperation(SegmentTreeMode segmentTreeMode)
        {
            int updater(int x) => x + 1;

            var segmentTree = segmentTreeMode == SegmentTreeMode.NodeBased ? new NodeBasedSegmentTree <SumQueryObject, int>(_randomRangesArray)
                : segmentTreeMode == SegmentTreeMode.ArrayBased ? new ArrayBasedSegmentTree <SumQueryObject, int>(_randomRangesArray)
                : (SegmentTree <SumQueryObject, int>) new NonRecursiveSegmentTree <SumQueryObject, int>(_randomRangesArray);

            for (int r = 0; r < _randomRangesCount; ++r)
            {
                Tuple <int, int> range = _randomRanges[r];

                if (range.Item1 % 2 == 0)
                {
                    segmentTree.Update(range.Item1, range.Item2, updater);
                }
                else
                {
                    segmentTree.Query(range.Item1, range.Item2);
                }
            }
        }
コード例 #3
0
        private void SegmentTreeQuery <TQueryObject>(SegmentTreeMode segmentTreeMode, ArrayMode arrayMode)
            where TQueryObject : SegmentTreeQueryObject <TQueryObject, int>, new()
        {
            var array = arrayMode == ArrayMode.AllRanges ? _allRangesArray
                : arrayMode == ArrayMode.RightEndingRanges ? _rightEndingRangesArray
                : _randomRangesArray;
            var segmentTree = segmentTreeMode == SegmentTreeMode.NodeBased ? new NodeBasedSegmentTree <TQueryObject, int>(array)
                : segmentTreeMode == SegmentTreeMode.ArrayBased ? new ArrayBasedSegmentTree <TQueryObject, int>(array)
                : (SegmentTree <TQueryObject, int>) new NonRecursiveSegmentTree <TQueryObject, int>(array);

            if (arrayMode == ArrayMode.AllRanges)
            {
                for (int i = 0; i < array.Count; ++i)
                {
                    for (int j = i; j < array.Count; ++j)
                    {
                        segmentTree.Query(i, j);
                    }
                }
            }
            else if (arrayMode == ArrayMode.RightEndingRanges)
            {
                for (int i = 0; i < array.Count; ++i)
                {
                    segmentTree.Query(i, array.Count - 1);
                }
            }
            else
            {
                for (int i = 0; i < _randomRangesCount; ++i)
                {
                    Tuple <int, int> range = _randomRanges[i];

                    segmentTree.Query(range.Item1, range.Item2);
                }
            }
        }