随笔分类 -  动态规划 - 单调队列/单调栈

摘要:刚开始想出了一个分治做法,但是比较麻烦,需要分 4 中情况讨论. 后来偷看了一眼标签发现是线段树,然后就想出了这个线段树做法. 考虑序列以 $r$ 为右端点的答案,有 $\sum_{l=1}^{i} max(l,i)-min(l,i)=i-l$. 其中这个条件可以写成 $max(l,i)-min(l 阅读全文
posted @ 2020-07-11 07:51 EM-LGH 阅读(218) 评论(0) 推荐(0)
摘要:这算是决策单调性入门题吧. 我们很容易发现 $f[i]$ 的转移 $p_{i}$ 满足单调性,然后拿单调队列来维护就行. 对于队列中每个元素维护这个元素转移区间的右端点 新加入一个点的时候和队尾比较一下,看队尾是否会被覆盖,弹掉无用元素. code: #include <bits/stdc++.h> 阅读全文
posted @ 2020-04-02 23:06 EM-LGH 阅读(200) 评论(0) 推荐(0)
摘要:对于树边直接转移,然后按照套路拆环,在环上做一个单调队列 DP. 一种方案虽然在一个换上可能算不了,但是一定可以在另一个环上计算到. 仙人掌上 DP 的套路就是遇到树边就按照树上做,遇到环就拆环,做一个环形 DP. code: #include <bits/stdc++.h> #define N 2 阅读全文
posted @ 2020-03-29 23:40 EM-LGH 阅读(139) 评论(0) 推荐(0)
摘要:CF1305C 题解: 我们发现虽然 $n$ 很大,但是模数很小,所以相当于 $n$ 个数对 $m$ 取模后不能有重复数字. 那么其实这个 $n$ 最大也就是 $m$ ,直接 $O(m^2)$ 暴力算就行了. code: #include <bits/stdc++.h> #define ll lon 阅读全文
posted @ 2020-03-05 22:56 EM-LGH 阅读(294) 评论(0) 推荐(1)
摘要:维护 $dp[i]$ 表示长度为 $i$ 的 $LIS$ 的最小结尾长度. 然后每次我们新加入一个区间 $[l,r]$ ,这个可以用平衡树来维护:区间平移,区间+1,单点赋值. 调不出来QAQ.... code: #include <cstdio> #include <string> #includ 阅读全文
posted @ 2020-03-02 23:09 EM-LGH 阅读(229) 评论(0) 推荐(0)
摘要:非常好的一道题. 我们考虑枚举哪些三元组不能成为答案. 然后你发现这成了一个立方体并问题. 通过枚举 $c$ ,可以将问题转化为二维矩形并问题. 由于从大到小枚举 $c$,所以并是不断增大的,然后增大的话就会让 $a/b$ 延伸到极大值位置. 所以只有 $a,b$ 是单调的,才会对答案有影响,这么更 阅读全文
posted @ 2020-03-02 18:01 EM-LGH 阅读(144) 评论(0) 推荐(0)
摘要:显然先用单调栈求出一个位置向左/右延申的最大长度(即这些区间中当前位置是最大值位置) 然后我们发现我们可以离线,然后按照最大值位置依次添加线段,每次用线段树查一个区间和. 然后我们想查满足最大值位置在 $[l,r]$ 之间,$[l,r]$ 内区间和. 这个显然满足可减性(即最大值位置在 $[1,r] 阅读全文
posted @ 2020-02-29 17:41 EM-LGH 阅读(221) 评论(0) 推荐(0)
摘要:这个题的思路还是十分巧妙的. 我们发现我们要查询的区域恰好构成了一个梯形. 然后用那个单调栈去维护折线,并用主席树做二维数点. code: #include <cstdio> #include <algorithm> #include <stack> #include <cstring> #incl 阅读全文
posted @ 2020-02-06 15:44 EM-LGH 阅读(173) 评论(0) 推荐(0)
摘要:Description 影魔,奈文摩尔,据说有着一个诗人的灵魂。事实上,他吞噬的诗人灵魂早已成千上万。千百年来,他收集了各式各样 的灵魂,包括诗人、牧师、帝王、乞丐、奴隶、罪人,当然,还有英雄。每一个灵魂,都有着自己的战斗力,而影魔,靠 这些战斗力提升自己的攻击。奈文摩尔有 n 个灵魂,他们在影魔宽 阅读全文
posted @ 2019-12-18 18:10 EM-LGH 阅读(186) 评论(0) 推荐(0)
摘要:这个和 bzoj 5469 几乎是同一道题,但是这里给出另一种做法. 你发现你要求的是一个树上 LIS,而序列上的 LIS 有一个特别神奇的 $O(n\log n) $ 做法. 就是维护一个单调递增的栈,如果发现新加元素大于栈顶,则直接加入,否则在序列中二分出一个大于等于该元素的最小值,然后替换掉. 阅读全文
posted @ 2019-12-02 18:25 EM-LGH 阅读(157) 评论(0) 推荐(0)
摘要:code: #include <bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in","r",stdin) const int N=200006; const double eps=1e-6; const double 阅读全文
posted @ 2019-11-29 18:39 EM-LGH 阅读(160) 评论(0) 推荐(0)
摘要:不是很难想,但是细节巨多 开始一个地方想错了,然后...... code: #include <bits/stdc++.h> #define N 2000006 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using 阅读全文
posted @ 2019-11-28 11:11 EM-LGH 阅读(92) 评论(0) 推荐(0)
摘要:刷水~ Code: 阅读全文
posted @ 2019-07-21 11:05 EM-LGH 阅读(172) 评论(0) 推荐(0)
摘要:Code: 阅读全文
posted @ 2019-07-21 10:32 EM-LGH 阅读(148) 评论(0) 推荐(0)
摘要:Description 你将要游览一个有N个岛屿的公园。从每一个岛i出发,只建造一座桥。桥的长度以Li表示。公园内总共有N座桥。尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走。同时,每一对这样的岛屿,都有一艘专用的往来两岛之间的渡船。 相对于乘船而言,你更喜欢步行。你希望所经过的桥的总长度尽 阅读全文
posted @ 2019-07-18 07:22 EM-LGH 阅读(200) 评论(0) 推荐(0)
摘要:Code: 阅读全文
posted @ 2019-07-06 16:03 EM-LGH 阅读(229) 评论(0) 推荐(0)
摘要:Code: 阅读全文
posted @ 2019-07-06 09:08 EM-LGH 阅读(179) 评论(0) 推荐(0)