1.区间加 2.区间求和 这两个操作都属于线段树的基本操作 前置——宏定义# #defineN100011#definelsonrt<<1#definersonrt<<1|1#defineintlonglong 由于我特别懒,不想写什么rt<<1rt<<1之类的东西,所以直接宏定义就好了,还有,为了不改intint,我直接把intint宏定义为longlonglonglong,省的麻烦(我真的是懒到...
洛谷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,int...
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++)...
设原数组为 \(a_i\), 差分后的数组为 \(b_i = a_i - a_{i-1}\); 于是\(a_i = \sum_{j=1}^{i}{b_j}\); 那么[1,x]的区间和为 \(sum_x = \sum_{i=1}^{x}a_i = \sum_{i=1}^{x} \sum_{j=1}^{i}b_j\) \(sum_x = a_1 + a_2 + \cdots + a_x\) ...
此题同codevs1082线段树练习3。 代码 #include<iostream>#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;constintmaxn=200000+5; typedeflonglongll; inlineintread() {intx=0,f=1;charch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>...
题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数加上x;2.求出某区间每一个数的和。 解法:如题,模版题。需要加上 lazy 标记,也就是我的 upd。lazy 标记的思路就是对一个结点更新(算和)了,但不继续更新它下面的结点,而是标记下来(每个数需加上的值)。注意——边界判断,不能调用a[-1]之...
【模板】线段树1 洛谷评测机出问题了吗? 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。
【代码】 //线段树板子(splay复习) #include<iostream> #include<cstring> #include<cstdio> #define ll long long #define M(a) memset(a,0,sizeof a) #define fo(i,j,k) for(i=j;i<=k;i++) using namespace std; const int mxn=100005; ...
洛谷P3372 【模板】线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值...
洛谷P3372 【模板】线段树 1(树状数组) 目录 题意 Sol 回到顶部 题意 题目链接 回到顶部 Sol Get到了这题树状数组的做法,感觉非常nice 区间加:直接差分 区间求和:考虑每一位的贡献 sumxi=1(x+1−i)disumi=1x(x+1−i)di =sumxi=1(x+1)di−∑xi=1idi=sumi=1x(x+1)di−∑i=1xidi =(...