题目链接 树状数组+单调栈 计算出每个后缀的前面、后面第一个h[]比它小的(前闭后开),乘起来计算答案 1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstd
分类:
其他好文 时间:
2016-02-28 21:14:55
阅读次数:
226
题目给一个由几个相连接的矩形组成的多边形,计算多边形包含的最大的矩形的面积。 要求的矩形的高一定是某一个用来组合的矩形的高;如果枚举每个矩形作为高的话,那样长就是这个矩形能向左向右继续延伸矩形的长度了。 所以这题本质也是用单调栈在O(n)计算出每个数作为最小数向左和向右能延伸的最长距离。 1 #in
分类:
其他好文 时间:
2016-02-28 21:12:02
阅读次数:
132
题意:给一个非负整数序列,求哪一段区间的权值最大,区间的权值=区间所有数的和×区间最小的数。 用单调非递减栈在O(n)计算出序列每个数作为最小值能向左和向右延伸到的位置,然后O(n)枚举每个数利用前缀和O(1)计算出以这个数为最小值能得到的最大的区间权。 以前写的单调栈,三个if分支,写得繁繁杂杂的
分类:
其他好文 时间:
2016-02-28 19:57:26
阅读次数:
177
因为是一个排列,所以可以用$n$位二进制数来表示$O(n\log n)$求LIS时的单调栈。 首先通过$O(n^22^n)$的预处理,求出每种LIS状态后面新加一个数之后的状态。 设$f[i][j]$表示已选数字集合为$i$,LIS状态为$j$的方案数。 转移时枚举不在$i$里的数$t$,如果$t$
分类:
其他好文 时间:
2016-02-19 20:23:33
阅读次数:
388
A Magic Lamp 题意:不能改变数字序列的顺序,从n个数中删除m个,输出删除后最小的数;(m<n<=1000)输出忽略前导0; 分析:这道题其实数据范围可以达到1e6;看很多人的题解都是ST或者是RMQ,其实是一道单调栈的题;O(n)的算法。 简单讲讲单调栈的思想:要求的是删除后最小的,那么
分类:
其他好文 时间:
2016-02-15 22:37:54
阅读次数:
221
明显要用求SA再求h,而lcp(i,j)就等于i到j之间最小的h 用f[i]表示i跟比i大的后缀的lcp的和,然后用单调栈维护最小值就好了(有点像DP?) 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #
分类:
其他好文 时间:
2016-02-11 16:52:39
阅读次数:
336
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5120 Solved: 1899[Submit][Status][Discuss] Description 在xoy直角坐标平面上有n条直线L1,L2,...L
分类:
其他好文 时间:
2016-02-02 14:29:23
阅读次数:
176
Common SubstringsTime Limit: 5000MSMemory Limit: 65536KTotal Submissions: 8748Accepted: 2899DescriptionA substrin...
分类:
编程语言 时间:
2015-11-29 19:33:16
阅读次数:
244
题意:n个点, 坐标已知,其中横坐标为为1~n。 求区间[l, r] 的所有子区间内斜率最大值的和。首先要知道,[l, r]区间内最大的斜率必然是相邻的两个点构成的。然后问题就变成了求区间[l, r]内所有子区间最大值的和。这个问题可以利用单调栈来做。每次找到当前点左面第一个大于当前值的点, 然后更...
分类:
其他好文 时间:
2015-11-29 06:23:16
阅读次数:
171
题目链接:http://poj.org/problem?id=3250题意: n个牛排成一列向右看,牛i能看到牛j的头顶,当且仅当牛j在牛i的右边并且牛i与牛j之间的所有牛均比牛i矮。 设牛i能看到的牛数为Ci,求∑Ci本题正确解法是用栈来做的-----刚开始看的时候表示根本想不到栈单调栈-----...
分类:
其他好文 时间:
2015-11-15 17:33:59
阅读次数:
136