上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 53 下一页
摘要: 莫队+st表 据说这是经典问题,但是我不会。。。 问题在于莫队怎么算贡献,每次移动一个位置,现在为[l,r],那么就增加了[l-1,r),r的贡献,怎么算呢?我们预处理fl,fr,fl[i]表示以i为开头的前缀和,fr表示以i为结尾的后缀和,这个东西能够相减,但也不是完全满足 每次我们计算贡献的时候 阅读全文
posted @ 2017-11-30 10:56 19992147 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 状压dp 图上怎么跑dp?我们跑三进制状压dp,0表示选了,1表示既没选也没覆盖,2表示没选但是被覆盖了。 状态是dp[dep][S]表示当前走到了深度为dep的节点,状态为S,按照dfs序转移 每次转移就是计算这个点选了没选,然后像树形dp一样更新节点 返祖边也要处理 #include<bits/ 阅读全文
posted @ 2017-11-29 21:19 19992147 阅读(113) 评论(0) 推荐(0) 编辑
摘要: 二分图+矩阵求逆 既然我们考虑b能替换哪些a,那么我们自然要得出b被哪些a表示,这里我们设一个矩阵C,那么C*A = B 为什么呢?直接A*C = B是不可行的,因为都是行向量,不能直接乘,那么我们转置一下,得出At*C=Bt,这样就很科学了,那么再转回来,A*Ct=B,于是Ct=B*A^-1那么矩 阅读全文
posted @ 2017-11-28 20:12 19992147 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 最短路+最小生成树 因为所有东西都只跟加油站有关,那么我们只留加油站就行了。 先预处理出每个点到加油站的最短距离,这个用多源最短路,就是把所有加油站放到堆里,然后就是重构图,我们不用直接连边,计算出每条边的贡献,然后跑最小生成树,这里直接离线查询就行了。 #include<bits/stdc++.h 阅读全文
posted @ 2017-11-28 20:04 19992147 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 拓扑排序+set 如果我们直接记录所有路径是不行的,那么我们要降低路径的数量,于是我们把最短路径转换到边上,这样我们就只有m条路径了。 先计算出f[i]和g[i]表示正反拓扑最长链,把所有g插到set里,然后按照拓扑序依次枚举删点,把之前加入过的边删除,删除g[u],查询最大值,然后加入后继边每条边 阅读全文
posted @ 2017-11-28 19:58 19992147 阅读(142) 评论(0) 推荐(0) 编辑
摘要: 动态电分治+二分 肯定要枚举所有点对,那么我们建出点分树降低树高,然后每个点存下点分树中所有子树到这个点的距离,然后二分+lower_bound就行了。 #include<bits/stdc++.h> using namespace std; const int N = 2e5 + 5; names 阅读全文
posted @ 2017-11-28 19:50 19992147 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 动态点分治 先建出点分树,每个点上维护两个堆,s1,s2,分别表示子树中到点分树中父亲的所有长度,每个儿子s1的最大值,那么对于每个点答案就是s2的最大+次大,再维护一个s3保存这个。 首先我们要搞一个带删除的堆,那么我们开两个堆就行了,一个保存元素,一个保存被删除的元素,每次一起弹出就行了 然后是 阅读全文
posted @ 2017-11-23 23:06 19992147 阅读(119) 评论(0) 推荐(0) 编辑
摘要: 后缀自动机+线段树 今天比较颓。。。 既然只出现一次,那么就是right=1,于是我们预处理出每个点的right,然后看是否等于一,如果是就更新答案。 更新答案维护两个线段树,如果当前点在延伸[Min,Max]范围内,那么答案就是end-i+1,如果<Min,那么答案就是Min,于是我们维护end+ 阅读全文
posted @ 2017-11-23 23:01 19992147 阅读(128) 评论(0) 推荐(0) 编辑
摘要: kdtree 转换一下,看成点,第一位dfs序,第二维深度,那么满足在子树内dfs序限制,然后kdtree上打标记就行了。 #include<bits/stdc++.h> using namespace std; const int N = 1e5 + 5, mod = 1e9 + 7; int r 阅读全文
posted @ 2017-11-23 00:33 19992147 阅读(174) 评论(0) 推荐(0) 编辑
摘要: kdtree 3维kdtree,就是三个维度轮换着切,我们把每个元素看成一个点,坐标是上次出现的位置,下次出现的位置,自己的位置,第一个<l,第二个>r,第三个[l,r],然后kdtree上爆搜剪枝就行了。 kdtree看起来能解决所有偏序问题。 #include<bits/stdc++.h> us 阅读全文
posted @ 2017-11-23 00:32 19992147 阅读(183) 评论(0) 推荐(0) 编辑
上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 53 下一页