随笔分类 - 数据结构—单调队列
摘要:本来想先求出点双再一个一个处理结果写了很长发现太麻烦 设f[u]为u点向下的最长链 就是再tarjan的过程中,先照常处理,用最长儿子链和次长儿子链更新按ans,然后处理以这个点为根的环,也就是这个点是dfs第一次到这个环访问到的点 环用来更新ans的是儿子链+到根的一段,这个直接for一边就行,还
阅读全文
摘要:考虑静态怎么做:枚举右边界,然后枚举上边界,对应的下边界一定单调不降,单调栈维护每一列从当前枚举的右边界向左最长空位的长度,这样是O(nm)的 注意到n =m,所以m include using namespace std; const int N=4000005; int n,m,Q,len[N'
阅读全文
摘要:把模板串建一个广义SAM 然后在线查询,每次在SAM上预处理出一个a[i]表示i位置向前最多能匹配多长的模板串 二分答案L,dp判断,设f[i]为·~i有几个匹配,转移显然是f[i]=max{f[i 1],f[j]+i j(i a[i]=L\ 0.9
阅读全文
摘要:玉石桥 斜倚把栏杆靠
鸳鸯来戏水
金色鲤鱼在水面朝
阅读全文
摘要:设f[a][i][j]为第a段时间结束时在(i,j)位置的最长滑行距离,转移很好想,就是分四个方向讨论,然后枚举这段时间的滑行长度取个max即可 但是这样是O(n^4)的,考虑优化 发现同一行或列,取max对应a 1中的是单调挪动的一个区间,所以用单调栈维护当前区间,每次移动的时候要把左端点已经大于
阅读全文
摘要:~~没有复杂结构甚至不长但是写起来就很想死的代码类型~~ 原理非常简单,就是用先用单调队列处理出mn1[i][j]表示i行的j到j+k 1列的最小值,mx1[i][j]表示i行的j到j+k 1列的最大值 然后就变成求单列最大最小值,用上面同样的方法处理出对于列的mn2mx2即可 cpp includ
阅读全文
摘要:我要懒死了,所以依然是lyd的课件截图 注意是min{max(max(d[uk]),dis(u1,ui),dis(uj,un))},每次都从这三个的max里取min cpp include include using namespace std; const int N=500005; int n,
阅读全文

浙公网安备 33010602011771号