我向来不喜欢废话,直接开始说啦!
预处理:
①段数t=sqrt(n);
②每段左边界L[i]=(i-1)*t+1;
③每段右边界R[i]=i*t;
④补充处理:t2小于n的再补一段,左边界R[t-1]+1,右边界n;
⑤区间和sum[i]=∑jL[i]<=j<=R[i]a[j];
⑥预设增量标记add=0;
区间修改:
(情况一)l,r在同一块内:直接对区间内的每个数加,区间和用询问长度用修改1次;
(情况二)l,r不在同一块内:
①l+1到r-1块内:全部修改增量标记;
②l块:做法同情况1,右边界是R[pos[l]];
③r快:做法同情况1,左边界是L[pos[r]];
区间查询:
(情况一)l,r在同一块内:直接对区间内的数求和,再加上增量标记*询问长;
(情况二)l,r不在同一块内:
①l+1到r-1块内:全部加上区间和以及增量标记*段长;
②l块:做法同情况1,右边界是R[pos[l]];
③r快:做法同情况1,左边界是L[pos[r]];
整体思想:大段维护,菊(抱歉打错字啦)局部朴素
撒花!