1.区间加 2.区间求和 这两个操作都属于线段树的基本操作 前置——宏定义# #defineN100011#definelsonrt<<1#definersonrt<<1|1#defineintlonglong 由于我特别懒,不想写什么rt<<1rt<<1之类的东西,所以直接宏定义就好了,还有,为了不改intint,我直接把intint宏定义为longlonglonglong,省的麻烦(我真的是懒到...
建立线段树的代码为: //建立线段树voidbuild(intu,intl,intr){ tr[u] = {l, r};if(l == r) tr[u].sum = a[l];else{intmid = l + r >>1;build(u <<1, l, mid);build(u <<1|1, mid +1, r);pushup(u); } } 时间复杂度:每一次递归都会创建一个节点,一共2n-1个节点,创建线段...
for(int i=bel[l]+1;i<bel[r];i++) res+=sum[i]+mark[i]*size[i]; } return res; } int main(void){ int x,y,id,z; scanf("%d%d",&n,&m); init(n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=sq;i++) for(int j=st[i];j<=ed[i];j++)...
if(ch[x][1]) ADD(ch[x][1],add[x]); add[x]=0; } } inline void rotate(int x) { pushdown(x); int fa=f[x],fafa=f[fa],which=get(x); ch[fa][which]=ch[x][which^1],f[ch[fa][which]]=fa; ch[x][which^1]=fa,f[fa]=x; f[x]=fafa; if(fafa) ch[fafa][ch[fafa...
洛谷P3372 【模板】线段树 1 LIST P3372 【模板】线段树 1 正文 Return Top P3372 【模板】线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数...
洛谷P3372 【模板】线段树 1 这题是线段树的区间加、区间修改和懒标记,注意开long long 1#include<bits/stdc++.h>2#definels (x<<1)3#definers (x<<1|1)4#definerep(i,a,b) for(int i=a;i<=b;i++)5#definepb(a) push_back(a)6usingnamespacestd;7typedeflonglongll;8typedef pair<int,...
【模板】线段树1 洛谷评测机出问题了吗? 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。
洛谷P3372 【模板】线段树 1 【树状数组解法】,题链这里用树状数组写法;考虑求[1,x]的区间和\(sum_x\),于是将原数组差分后,相当于求一个二阶前缀和;设原数组为\(a_i\),差分后的数组为\(b_i=a_i-a_{i-1}\);于是\(a_i=\sum_{j=1}^{i}{b_j}\);那么[1,x]的...
洛谷【P3372】【模板】线段树1 【题目大意】 第一行输入两个数n,m分别代表数字个数和操作个数(n<=100000, m<=100000) 第二行输入n个数,编号从1到n,分别代表这n个数的值 接下来m行有m个操作,格式如下: 1 x y k 将区间[x,y]内每个数加上k ...
洛谷P3372 【模板】线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值...