前言
根号算法博大精深,决定在此收集。
例题我博客基本都能找到。
带根号算法
分块算法
一种是最普通的分块算法,把序列分块,然后可以解决区间问题。分块算法可以维护一些线段树维护不了的东西,例如单调队列等,线段树能维护的东西必须能够进行信息合并,而分块则不需要。不过,和线段树一样,分块需要支持类似标记合并的东西。
当然,为了使得速度不至于太慢,每一块的大小应该通过实验得知。即找到一个合理的块大小,使得在该大小下算法跑的比较快。
具体实现时,用belong[i]表示i所属块。对于修改操作,某一块全部要被修改,则更改它的信息。多余部分直接暴力修改,有些时候需要对多余部分所属块进行暴力重构(例如维护单调队列)。
例题:jzoj3167查税,用分块维护单调队列。去年五校联考第六场的第三题,用分块维护桶。bzoj2002弹飞绵羊,用分块维护答案。bzoj3809Gty的二逼妹子序列的一种算法中需要用到这种最普通的分块。jzoj4438K小数查询。
还有其他的分块,这类题目没有修改操作,但是要求询问的东西较难维护。其通常为预处理ans[i,j]表示第i块到第j块的答案,然后再预处理sum[i,j]表示前j块i元素的出现次数,然后对于一个询问,只对多余部分进行扫描,然后可以用一些数据结构维护。
又或者预处理第i块到第n块的答案诸如此类。都是没有修改,利用分块的题目。
例题:bzoj4241历史研究,bzoj3289Mato的文件管理,bzoj2821作诗,bzoj2724蒲公英,bzoj374