单调队列
zhhx2001
这个作者很懒,什么都没留下…
展开
-
vijos1091(单调队列)
对于环我们可以把它复制粘在后面。然后我们对于每一个加油站,设置一个a[]表示在这一个加油站加的油减去从这个加油站开到另一个加油站的差。那么我们要想选定某个加油站i作为起点,问题就变成了从i到i+n能够中间不断油,不断油的表现就是对于路径上的任何一个加油站k,有a[i]+a[i+1]...+a[k]>0,我们维护一个前缀和s[i]=a[1]+a[2]+a[3]+...a[i],那么a[i原创 2016-06-21 21:52:20 · 343 阅读 · 0 评论 -
bzoj1499(这道题改天重做,dp+单调队列优化)
这么简单的dp竟然没有想出来,果然到了晚上状态就差,然后这道题代码编起来也很绕最后把我搞的直接醉了,逼我做了一次面向标程编程其实感觉问最长距离,问方案总数的,就可以试着往dp方面去想,这道题看到应用立马反应是dp才对,单调队列灵活改一下就过了啊这道题挺好的,以后重新写一下#include#include#include#include#includeusing n原创 2016-07-21 21:27:23 · 718 阅读 · 0 评论 -
单调队列
单调队列单调队列,顾名思义就是具有单调性的队列O(∩_∩)O~,一般的队列只能从队尾入队、队首出队;为了保持单调队列的单调性,单调队列除具有这两种性质外,还可以从队尾出队。以单增的单调队列为例,当元素t要入队时,先要从队尾依次弹出所有>=t的元素,再将t加在队尾。举个例子,如果序列:1 3 -1 -3 10要构成单调队列,先将元素“1”放入队列中,以初始化队列,接着元素“3”要原创 2016-04-26 21:57:13 · 378 阅读 · 0 评论 -
bzoj1012(线段树或单调队列)
线段树#include#include#include#include#includeusing namespace std;struct aa{ int l,r,mx;}a[200005*4];int n,tot,m,mod;void build(int i,int l,int r){ a[i].l=l;a[i].r=r; if (l==r) retur原创 2016-08-13 10:07:34 · 1104 阅读 · 0 评论 -
bzoj1047(单调队列,矩阵中)
没那么难,不需要什么二维单调队列,其实只要改变一下顺序就好为了思路清晰,这里采用的结构体+结构体函数写的单调队列刚开始感觉不会,看hzwer的blog,上面说,题解都太麻烦,还不如手推,就没继续看下去,事实证明这道题回来一看就秒了,也不知道是怎么想的。。。猜的?其实就是一行一个单调队列,端点每往右移一位,就计算从上到下的情况#include#include#includ原创 2016-08-13 11:12:45 · 439 阅读 · 0 评论 -
bzoj1855(单调队列优化dp讲解)
这个,感觉思路不是特别清楚。单调队列维护dp,一般就是把一个N维的dp优化成一个N-1维的dp式子形如:dp【i】=max(f【j】)+g【i】(这里的g【i】是与j无关的量),且j的取值是一段连续区间,并随着i增大而增大的区间这里的f【j】是和j有关的项,一般包括dp【j】和与其相关的项。这道题:思路:设f[i][j]表示到第i天手里持有j的股票的最大收益,那么第i天原创 2016-08-13 15:54:52 · 1460 阅读 · 0 评论 -
hdu4374(单调队列优化dp)
这题的转移很明显。用dp[i][j] 表示到达i层j位置时的最大得分sum[i][j] 表示第i层前j个数的和dp[i][j] = max(max(dp[i - 1][j + k] + sum[i-1][j +k-1] - sum[i - 1][j - 1] + score[i][j]), max(dp[i - 1][j - k] - sum[i-1][j -k] + su原创 2016-08-13 17:51:57 · 288 阅读 · 0 评论 -
诺诺的队列(单调栈的第一次运用+二分)
单调栈,感觉是一个很灵活的东西,算个辅助降低复杂度的东西吧#include#include#includeusing namespace std;int s[500009],top=0,n,k;int main(){ scanf("%d",&n); int ans=0; scanf("%d",&s[1]);top=1; for (int i=2;i<=n;i++) {原创 2016-07-02 08:54:16 · 483 阅读 · 0 评论