分块
分块的思想和珂朵莉树很类似,就是把原序列分成若干个块,对块进行操作的奇妙思想。复杂度通常带根号。分块的块长也有讲究,通常对于大小为 n n n 的数组,取距离 n \sqrt n n 最近的 2 2 2 的幂数或直接取 n \sqrt n n 即可,如果 TLE 了可以考虑把块长乘 2 2 2 或除以 2 2 2。
数列分块
最简单的分块。基本上分两步走,对于一个操作的区间 [ l , r ] [l,r] [l,r],如果刚好在某个块区间内,直接暴力修改 [ l , r ] [l,r] [l,r] 的值;如果横跨多个区间,先处理整块,然后处理边角料。
常用操作如下:
-
最简单的数列分块操作,具体详见代码:
#include <bits/stdc++.h> using namespace std; #define int long long const int maxn=5e4+5; int n,opt,ll,rr,cc,len,a[maxn],id[maxn],tag[maxn]; void add(int l,int r,int c) { int sid=id[l],eid=id[r]; if(sid==eid) for(int i=l;i<=r;i++