题解 P3372 【【模板】线段树 1】
2024-10-21 06:13:11
发一篇不需要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;
}
最新文章
- HTML学习有感
- 相机位姿估计0:基本原理之如何解PNP问题
- codeforces Gargari and Permutations(DAG+BFS)
- 基于vitamio的网络电视直播源码
- [Effective JavaScript 笔记]第62条:在异步序列中使用嵌套或命名的回调函数
- java 使用反射技术解耦
- Friendship
- BZOJ3166: [Heoi2013]Alo
- BZOJ1662: [Usaco2006 Nov]Round Numbers
- Java 中的resultset详解
- UDP vs. TCP
- HDU - 3001 Travelling 状压dp + 三进制 [kuangbin带你飞]专题二
- 12、Filter(拦截器)
- 手把手带你使用JS-SDK自定义微信分享效果
- Lab keepalived
- Java中 try--catch-- finally、throw、throws 的用法
- 几个常用的Node方法
- Pandas数据排序
- Java-JUC(九):使用Lock替换synchronized,使用Condition的await,singal,singalall替换object的wait,notify,notifyall实现线程间的通信
- Summary: Difference between null and empty String
热门文章
- spring-cloud - 服务之间的通信
- 检查iOS app 是否升级为新版本
- Ajax方式实现注册验证代码
- Linux学习之十八-sudo分权管理
- Linux学习之十五-Linux文件特殊权限和附加权限
- vue2.0 仿手机新闻站(四)axios
- doubango库改动Contact内容的地方
- [魅族Degao]Androidclient性能优化
- vscode 编译调试c/c++的环境配置
- 工作总结 a标签 <;a href=";/meetingtheme";>;Back to List<;/a>; 返回上一级 指向 控制器 默认Index @Html.ActionLink(";Edit59";, ";Edit";, new { id = item.ID }) 默认当前控制器