예제 #1
0
        public void RMQ_SparseTable()
        {
            var list = new List <int> {
                10, 1, 3, 9, 4, 8, 7
            };
            var rmq = new RMQSparseTable(list);

            Assert.Equal(1, rmq.MinElem(0, 3));
            Assert.Equal(1, rmq.MinElem(1, 4));
            Assert.Equal(3, rmq.MinElem(2, 5));
        }
예제 #2
0
        private static long LargestRec(RMQSparseTable rmq, int l, int r)
        {
            if (l == r)
            {
                return(rmq[l]);
            }
            var  minIdx  = rmq.MinIdx(l, r);
            var  minElem = rmq[minIdx];
            long maxRect = minElem * (r - l + 1);

            if (minIdx - 1 > 0 && l <= minIdx - 1)
            {
                maxRect = Math.Max(maxRect, LargestRec(rmq, l, minIdx - 1));
            }
            if (minIdx + 1 < rmq.Count && minIdx + 1 <= r)
            {
                maxRect = Math.Max(maxRect, LargestRec(rmq, minIdx + 1, r));
            }
            return(maxRect);
        }
예제 #3
0
        static long largestRectangle(int[] h)
        {
            var rmq = new RMQSparseTable(h);

            return(LargestRec(rmq, 0, h.Length - 1));
        }