题单适合人群
update:
P5309 分块+根号分治。考虑对x的大小分类讨论。
若x⩾ sqrtn则我们暴力给每个位置加,需要加的次数为O(sqrt n)次。由于需要查询区间和,用分块维护,总修改、查询复杂度为O(m\sqrt n)。
若x< sqrt n,我们需要用另外的方法维护。
注意到单次修改是针对整个序列的元素,所以对x,y相同的修改,我们可以累加它的贡献。 我们对每个x,维护y的前缀、后缀和。对于一次询问,我们可以当成把序列分成了若干个大小为x的块。中间的整块元素,每个块里肯定所有的yy都有,增加的贡献就是关于xx的修改总和。所有块的贡献相同,可以 O(1)算。边角的话,由于我们记录了前缀、后缀和,也可以 O(1)算。两个端点在同一个块中,则直接前缀和相减即可。(摘自 mrsrz 的题解)
真正可怕的大分块来了,加油消灭他们(已经自动过滤特别难的题目,大家可以去挑战一下)
P5046 对于整个区间,我们预处理出 L[i][j](以j为左端点,第i块的右端点为右端点),R[i][j](以j为右端点,第i块的左端点为左端点),P[i][j](以i块的左端点为左端点,j块的右端点为右端点)的逆序对数的个数,最后直接1+2-3就OK了,对于两边的角块,直接在最开始对每块排好序,询问时用归并排序的方法统计一下就OK了 。
P5048 也是神仙题(怎么lxl那么神仙),首先我们考虑像蒲公英那样,统计区间众数,然后最后想之前那样upperbound-lowerbound一下,复杂度大概是 能过才有鬼了),所以我们换种思路,我们考虑不直接统计众数了,我们直接统计众数出现次数,然后还是那样,把一个数出现的下标放进vector里边。然后就是角块的查询了,这也是这题最经典的一个优化的地方,我们事先统计好到了i这个位置的时候,有多少个和while(cnt[i]+ans<(int)s[a[i]].size()&&s[a[i]][cnt[i]+ans]<=r)ans++;
ans就是目前找到的区间众数出现次数。
这样弄是因为,如果cnt[i]+ans<size,就说明了这个数的出现次数至少为ans+1,所以我们就把ans往上抬,直到超过了,我们再往后面去找。右边块也差不多:
while(cnt[i]-ans>=0&&s[a[i]][cnt[i]-ans]>=l)ans++;
因为数的边界为
这两道是Ynoi2019模拟赛中两道分块解决的经典区间点对问题,至于为什么我没有把II拿进来,因为那是lxl的神仙二次离线莫队(。
P3793 分块优化ST表,大概就是把ST表分块,然后统计每一块的前后缀最大值,就可以在
估计你做完这些题目之后,分块就会有很大的进步的。
关于整除分块(也叫数论分块),可以参考我的blog(可能表格有点炸裂,不过也能看看吧) Link
其实整除分块跟分块没什么关系,就是借着分块整块处理的思想,优化复杂度而已。
UVA11526 板子题,不多说。
P3935 比较妙的一题,套了两次整除分块,还有比较精巧的推式子,值得一做。
P2261 转换一下也是模板,只是看看你能不能转换过来了。
P2260 应该是整除分块好题了,建议尽量不看题解自己做。
因为洛谷的整除分块的题目比较少,其它用到整除分块的题目基本上都是莫反了,所以就没有加进来,如果有其他的好题欢迎提供。
希望本题单能让大家有所收获~