这篇题解有点问题(分块标记处),但现在不想修,等有空修吧
分块是一种很神奇的暴力,学了它就会觉得什么都可以用分块做。
分块的主要思想就是整块快速查询,散块暴力查询。
比如说,分块可以在 \(O(q\sqrt{n}+n)\) 的时间复杂度内解决线段树模板题。
回到本题,显然我们可以用每个块维护内部有几个状态为 \(1\),修改与查询时暴力操作散块。
令 \(L_i,R_i,sum_i\) 代表第 \(i\) 个块的信息,起初 \(sum_i=0\)。
对于修改,我们发现对于整块存在 \(sum_i=R_i-L_i+1-sum_i\),而对于散块我们暴力修改,暴力更改 \(sum_i\)。
但是我们注意到一个问题,散块中的值可能之前被当作整块修改过,那时显然不可能具体修改每个状态,所以可能导致现在状态是错误的。
于是令 \(mark_i\) 代表第 \(i\) 个块之前被作为整块修改了多少次。
对于 \(a_i=0/1\),它的真实状态为 \(a_i\operatorname{xor} mark_{bel_i}\),容易发现这样修改是没有问题的。
对于查询,直接查询整块中的答案;而对于散块,暴力查询,注意异或上 \(mark_{bel_i}\)。
标签:暴力,分块,整块,sum,查询,题解,P3870,散块 From: https://www.cnblogs.com/BYR-KKK/p/18028072