
单调队列
make_it_for_good
这个作者很懒,什么都没留下…
展开
-
bzoj 2806 [Ctsc2012]Cheat 后缀自动机 单调队列优化dp
首先把字典中所有的串接在一起,两两间用非法字符隔开,跑一个后缀自动机(感觉这样比广义后缀自动机好写一些?) 然后对于要匹配的串在后缀自动机里跑一遍得到每个点向前能匹配的最大长度v[i]。求的东西可以二分答案。然后dp,设f[i]表示到i能匹配上的所有子串最大长度。f[i]=⎧⎩⎨max(f[i],f[j])(j∈[0,i−1])max(f[i],f[j]+v[i])(j∈[0,i−v[i]])max原创 2016-10-24 10:58:35 · 313 阅读 · 0 评论 -
bzoj 2792 [Poi2012]Well 单调队列 二分
二分答案,先求一个满足相邻两项之差不大于答案时每个位置的最大值b[i]。 设当前位置为i,二分的答案为x,那么需要满足对于j∈[1,n]j\in[1,n]b[i]=min(a[j]+|i−j|∗x)b[i]=min(a[j]+|i-j|*x) 对于j<ij<i直接维护最小值,对于j>ij>i用单调队列。 然后枚举0的位置,那么受影响区间的左右端点都单调。 求一个前缀和后可以O(1)O(1)计原创 2016-11-14 19:31:13 · 294 阅读 · 0 评论 -
bzoj 4295 [PA2015]Hazard 单调队列
对于每个人,他选的点为:x%m , (x+n)%m , (x+2n)%m …. (x+kn)%m会形成一个环。所有环的和为m。可能有一些人在一个环里对于一个人,如果求出这个人在走的过程中经历的最小值和走一个循环值的变化,就可以求出这个人走了多少个循环和走这些环后的剩余值。如果求出这个人之后到达每一个值需要的最小步数就可以求出在走完环之后又走了多少步。走一个循环值的变化可以直接求。 维护一个前缀和。原创 2016-11-18 12:41:34 · 585 阅读 · 0 评论 -
bzoj 2500 幸福的道路 dfs 单调队列
dfs维护一个每个点向下和向上的最长路。 开两个单调队列,单调递增和单调递减,找最后一个不满足条件的点。 注意队首留一个非法的点便于更新。 每次的决策点与之前的决策点取max。#include <bits/stdc++.h>using namespace std;#define N 1100000#define ll long longint n,m,top,ans,pos;int原创 2016-12-12 20:36:36 · 346 阅读 · 0 评论 -
bzoj 1758 [Wc2010]重建计划 01分数规划 点分治 单调队列
直接01分数规划,然后把树分治查找所有链,然后合并时就是查一个定长区间的最大值,宽搜离线下来然后单调队列搞就行了。不过我想说这题卡常数。。。卡常数。。。常数。。数。。 不过好像三个月之前做就没有这事了。。。树分治可以预处理快了两倍,01分数规划从二分改成迭代快了四倍+,然而bz上还是跑了20+s。。。#include <bits/stdc++.h>using namespace std;#de原创 2016-12-26 19:27:18 · 419 阅读 · 0 评论