就是区间询问问题,m次询问,问你[L,R]区间什么什么。。。。。
1,区间和
这类问题都极好处理
I、离线查询,直接sum[i]存储前缀和(sum[i]=sum[i-1]+a[i],即存储了前i个数的和),SUM(L->R)= sum[R] - sun[L-1]。
II、在线查询,单点修改推荐树状数组,代码简单:
int arr[MAXN]; //初始为0
inline int sum(int x){int res=0;while(x)res+=arr[x],x-=lowbit(x);return res;}
inline void add(int x,int n){while(x<MAXN)arr[x]+=n,x+=lowbit(x);}
inline int query(int x,int y){return sum(y)-sum(x-1);}
区间修改,推荐线段树
2,线段树理解
递归的思想,用二叉树来实现。
如果我们能用很少的运算通过[L,(L+R)/2],[(L+R)/2 + 1,R]计算出[L,R],那就可以用线段树了
3,莫队算法(离线查询)理解
将需要查询的m个区间排好序,通过对上一次查询的区间的两个端点的移动来得出本区间的答案,每一次查询的时间复杂度就是两个端点的移动次数和
(例如从[1,10]求[2,15],左端点向右移1次,右端点向右移5次就ok了)
如果我们知道区间[L,R] ,就能在比较短的时间内求出[L?1,R],[L+1,R],[L,R?1],[L,R+1] 的话,那就可以用莫队算法了。
据说:莫队算法的实质是通过将询问排序,每个询问均由前一个询问(排序后的)转移得来,通过一定的排序优化时间复杂度。往往可以有O(N√N) 的效果