发一篇不需要O2就能过的分块。

基本思路:

分块的思路,大段维护,小段朴素。

维护几个数组:

  • 区块\(block[maxn]\)
  • 懒标记\(tag[maxn]\)
  • 真实数据\(data[maxn]\)。

更新时

假设我们涉及到的区块的编号区间是\([lb,rb]\),真实数据范围为\([l,r]\)。

那么,我们在区块的\([lb+1,rb-1]\)区间,给\(block[i]\)加上\(\Delta k\) 并且打上懒标记 \(=\Delta k\)。在真实数据的\([l,lb\times N]\)和\([rb\times N-N+1,r]\)区间的每个\(data[i]\)加上\(\Delta k\)。

查询时

同样的,对于区块区间\([lb+1,rb-1]\)直接累加就好,对于\(l b\)区间和\(rb\)区间单独处理即可。

上丑陋无比的代码。注意特判\(l\)和\(r\)在一个区块区间的情况。

#include<bits/stdc++.h>
using namespace std;
template< class ccf >inline ccf qr(ccf a) {
char c=getchar();
ccf x=0;
int q=1;
while(c<48||c>57)
q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)
x=x*10+c-48,c=getchar();
return q==-1?-x:x;
}
const int maxn=100055;
typedef long long ll;
ll data[maxn];
ll tag[maxn];
ll blk[maxn];
int n;
int m;
int N;
int adj;
#define RP(t,a,b) for(register int t=(a),edd=(b);t<=edd;t++)
int t1,t2;
ll t3;
int temp; void add(int l,int r,ll k) {
int lb=(l+N-1)/N;
int rb=(r+N-1)/N;
if(lb!=rb) { RP(t,l,N*lb)
data[t]+=k,blk[lb]+=k;
RP(t,N*rb-N+1,r)
data[t]+=k,blk[rb]+=k;
RP(t,lb+1,rb-1)
tag[t]+=k,blk[t]+=N*k;
} else
RP(t,l,r)
data[t]+=k,blk[t]+=k;
} ll sum(int l,int r) {
ll ret=0;
int lb=(l+N-1)/N;
int rb=(r+N-1)/N;
RP(t,lb+1,rb-1)
ret+=blk[t];
if(tag[lb])
RP(t,N*lb-N+1,N*lb)
data[t]+=tag[lb];
tag[lb]=0;
if(tag[rb])
RP(t,N*rb-N+1,min(N*rb,n))
data[t]+=tag[rb];
tag[rb]=0;
if(lb!=rb) {
RP(t,l,N*lb)
ret+=data[t];
RP(t,N*rb-N+1,r)
ret+=data[t];
} else
RP(t,l,r)
ret+=data[t];
return ret;
} int main() {
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
n=qr(1);
m=qr(1);
RP(t,1,n)
data[t]=qr(1ll);
N=sqrt(n);
RP(t,1,n/N)
RP(i,1,N)
blk[t]+=data[(t-1)*N+i];
RP(t,1,n%N)
blk[n/N+1]+=data[(n/N)*N+t];
RP(t,1,m) {
temp=qr(1);
if(temp==1) {
t1=qr(1);
t2=qr(1);
t3=qr(1ll);
add(t1,t2,t3);
} else {
t1=qr(1);
t2=qr(1);
printf("%ld\n",sum(t1,t2));
}
}
return 0;
}

最新文章

  1. HTML学习有感
  2. 相机位姿估计0:基本原理之如何解PNP问题
  3. codeforces Gargari and Permutations(DAG+BFS)
  4. 基于vitamio的网络电视直播源码
  5. [Effective JavaScript 笔记]第62条:在异步序列中使用嵌套或命名的回调函数
  6. java 使用反射技术解耦
  7. Friendship
  8. BZOJ3166: [Heoi2013]Alo
  9. BZOJ1662: [Usaco2006 Nov]Round Numbers
  10. Java 中的resultset详解
  11. UDP vs. TCP
  12. HDU - 3001 Travelling 状压dp + 三进制 [kuangbin带你飞]专题二
  13. 12、Filter(拦截器)
  14. 手把手带你使用JS-SDK自定义微信分享效果
  15. Lab keepalived
  16. Java中 try--catch-- finally、throw、throws 的用法
  17. 几个常用的Node方法
  18. Pandas数据排序
  19. Java-JUC(九):使用Lock替换synchronized,使用Condition的await,singal,singalall替换object的wait,notify,notifyall实现线程间的通信
  20. Summary: Difference between null and empty String

热门文章

  1. spring-cloud - 服务之间的通信
  2. 检查iOS app 是否升级为新版本
  3. Ajax方式实现注册验证代码
  4. Linux学习之十八-sudo分权管理
  5. Linux学习之十五-Linux文件特殊权限和附加权限
  6. vue2.0 仿手机新闻站(四)axios
  7. doubango库改动Contact内容的地方
  8. [魅族Degao]Androidclient性能优化
  9. vscode 编译调试c/c++的环境配置
  10. 工作总结 a标签 &lt;a href=&quot;/meetingtheme&quot;&gt;Back to List&lt;/a&gt; 返回上一级 指向 控制器 默认Index @Html.ActionLink(&quot;Edit59&quot;, &quot;Edit&quot;, new { id = item.ID }) 默认当前控制器