洛谷 P3372 线段树1-分块做法

我向来不喜欢废话,直接开始说啦!

预处理:

①段数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]];

整体思想:大段维护,(抱歉打错字啦)局部朴素

撒花!

猜你喜欢

转载自www.cnblogs.com/Peter0701/p/10048728.html