![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
单调栈
gjghfd
这个作者很懒,什么都没留下…
展开
-
bzoj3956 -- 单调栈 + 线段树
对于区间[l,r][l,r],求出它的最大值的位置。显然不可能有点对跨越最大值。那么用单调栈预处理出每个点作为左端点、右端点的点对个数,求一个前缀和就可以了。原创 2017-07-13 17:15:15 · 585 阅读 · 0 评论 -
Codeforces860E Arkady and a Nobody-men -- 单调栈 + 倍增
不会数据结构。。。只能想其他做法。。。 令 deepideep_i 表示点 ii 的深度(根的深度为 11)。 显然点 xx 的答案可以表示成 ∑ni=1deeplca(i,x)\sum_{i=1}^n deep_{lca(i,x)}。 我们按深度从小到大枚举每个点,那么一个点的答案就等于它父亲的答案加上与它同深度的点对它的贡献。 对于同一深度的点,将它们按 dfsdfs 序从小到大排序,然原创 2017-09-18 20:47:27 · 824 阅读 · 0 评论 -
bzoj4709 -- 决策单调性优化DP
显然每个区间左右端点大小相等是最优的,否则可以把不相等的分出去。 于是可以列出DP方程: fi=max{fj−1+ai×(si−sj+1)2,ai=aj}f_i=\max \{ f_{j-1}+a_i\times(s_i-s_j+1)^2,a_i=a_j\} 由于二次函数是下凸的,可以用决策单调性优化。#include<bits/stdc++.h>using namespace std;#原创 2017-10-06 20:10:49 · 617 阅读 · 0 评论 -
[ 树上启发式合并 线段树 单调栈 ] BZOJ5040
可以用单调栈或线段树建出树,然后dsu on tree就好了。#include<bits/stdc++.h>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==原创 2017-12-26 13:39:25 · 402 阅读 · 0 评论