
分块
C202044zxy
这个作者很懒,什么都没留下…
展开
-
[LOJ 6046] 爷
一、题目 点此看题 二、解法 其实这道题可以转化成:ynoi2017,树和 lenlenlen 都是空壳子,用 dfs\tt dfsdfs 序把他放在序列上就可以了。 难维护的东西就想分块,并且这道题时限开这么大就是给分块准备的。然后每个块维护一个有序数组,询问的时候二分,修改打标记,暴力改边角料。时间复杂度O(nnlog2n)O(n\sqrt n\log^2 n)O(nnlog2n),炸掉。 但是如果你对分块的理解只停留在 n\sqrt nn 这个层面的话那永远都做不出来这题,分块是个很玄学的东西,原创 2020-11-19 18:40:59 · 224 阅读 · 0 评论 -
[unknown source] 蔬菜
一、题目 二、解法 根据部分分的提示,我们可以预处理一个二维前缀和拿到 subtask4\tt subtask4subtask4 的分数。 如果上述算法在某种蔬菜的出现次数较多,他的效率就比较高。那对于出现次数少的蔬菜呢?最好是无关蔬菜种类地统计,这指向了我们需要用算贡献的方法来处理这种蔬菜。 用点对贡献的方式,因为平方其实相当于求点对的数量。对于一种蔬菜我们任取两个点加入坐标(a,b,c,d)(a,b,c,d)(a,b,c,d),那么它对询问(x0,y0,x1,y1)(x_0,y_0,x_1,y_1)原创 2020-11-17 11:40:10 · 192 阅读 · 2 评论 -
[unknown OJ] 养花
一、题目 点此看题 二、解法 可以按照kkk分块,假设界限是SSS,假设值域是VVV 对于不足SSS的情况,可以暴力处理,建出线段树的时间花费是O(nS)O(nS)O(nS)的,查询是O(qlogn)O(q\log n)O(qlogn)的 对于超过SSS的情况,我们用kkk将值域划分成 V/kV/kV/k 段,对于每一段是可以直接找最大值的。问题变成了区间中值域区间最大值,用主席树即可,那么时间复杂度是O(nlognV/S)O(n\log n V/S)O(nlognV/S) 所以当S=VlognS=\原创 2020-11-16 21:36:11 · 174 阅读 · 0 评论 -
数学上来先打表
一、题目 点此看题 二、解法 如果是222操作直接连向前面的点,否则连向上一个点,这样dfsdfsdfs就可以得到一个顺序,问题就变成了只需要加入单条边和回退这条加入的边,用启发式合并的并查集就可以了。 为了询问我们需要值域分块,合并和回退的时候就维护一下这个块,询问的时候挨个扫值域,确定到一个值域中,然后我们就可以暴力地访问这个值域里的值,看他和当前点是不是同根,如果是的话减排名就行了。 #include <cstdio> #include <vector> #include &l原创 2020-05-20 21:57:13 · 211 阅读 · 0 评论 -
[BJOI2017]开车
一、题目 点此看题 二、解法 首先要明确答案如何算,方法为考虑每一条边的贡献,我们称两点之间的距离为边,那么这条边的贡献就是 距离乘上必须要经过它的车数(也就是左边的车减去车站 的绝对值): ∑dis×∣car−stop∣\sum dis\times |car-stop|∑dis×∣car−stop∣那么第一次就很容易算了,绝对值这个东西很不好维护,我们可以靠虑分块,当然我们这里是对边分块,所以我...原创 2020-03-12 15:48:51 · 241 阅读 · 0 评论 -
[HEOI2015]公约数数列
一、题目 点此看题 二、解法 对于这种维护奇怪东西的题就可以考虑分块qwqqwqqwq。 看上去gcd\gcdgcd和异或没有什么联系,也不好一起维护,所以我们分开维护,本题的复杂度是由于一个数组中前缀gcd\gcdgcd的取值最多log\loglog种,因为改变一次至少要减12\frac{1}{2}21 那么每一个块我们维护这些值:块内gcd\gcdgcd;前缀xorxorxor (整...原创 2020-03-12 09:09:57 · 275 阅读 · 0 评论