Step 1 题目描述
给你一个长度为 的序列,初始都为 0,你需要对这个序列进行单点修改以及区间求和,输出区间求和的结果。
Step 2 解题思路
裸的线段树板子题,主要就是建树,单点修改以及区间查询。
Step 3 AC code
3.1建树
void jianshu(int x, int l, int r)
{
a[x].l = l;
a[x].r = r;
if(a[x].l == a[x].r) {a[x].sum = 0; return;}
long long mid = (l + r) / 2;
jianshu(x * 2 ,l, mid);
jianshu(x * 2 + 1,mid + 1, r);
a[x].sum = a[x * 2].sum + a[x * 2 + 1].sum;
return ;
}
3.2修改(单点修改相当于l与r相等的区间修改)
void jiafa(int x,int l,int y)
{
int r = l;
if (a[x].l>=l&&a[x].r<=r){
a[x].sum+=(a[x].r-a[x].l+1)*y;
a[x].lazy+=y;
return;
}
if (a[x].r<l||a[x].l>r) return;
jiafa(2*x,l,y);
jiafa(2*x+1,l,y);
if (a[x].lazy) xiangxia(x);
a[x].sum=a[2*x].sum+a[2*x+1].sum;
return;
}
3.3查询
long long find(int x, int l, int r)
{
if(a[x].l >= l && a[x].r <= r){return a[x].sum;}
if(a[x].r < l || a[x].l > r){return 0;}
if(a[x].lazy) xiangxia(x);
return find(x * 2, l, r) + find (x * 2 + 1, l ,r);
}
3.4完整代码
#include<bits/stdc++.h>
using namespace std;
struct tree{
int l ,r;
long long sum, lazy;
}a[400005];
long long n ,w;
void jianshu(int x, int l, int r)
{
a[x].l = l;
a[x].r = r;
if(a[x].l == a[x].r) {a[x].sum = 0; return;}
long long mid = (l + r) / 2;
jianshu(x * 2 ,l, mid);
jianshu(x * 2 + 1,mid + 1, r);
a[x].sum = a[x * 2].sum + a[x * 2 + 1].sum;
return ;
}
void xiangxia(int x){
int m = (a[x].l + a[x].r) / 2;
a[2 * x].sum += (m - a[x].l + 1) * a[x].lazy;
a[2 * x + 1].sum += (a[x].r - m) * a[x].lazy;
a[2 * x].lazy += a[x].lazy;
a[2 * x + 1].lazy += a[x].lazy;
a[x].lazy = 0;
return ;
}
void jiafa(int x,int l,int y)
{
int r = l;
if (a[x].l>=l&&a[x].r<=r){
a[x].sum+=(a[x].r-a[x].l+1)*y;
a[x].lazy+=y;
return;
}
if (a[x].r<l||a[x].l>r) return;
jiafa(2*x,l,y);
jiafa(2*x+1,l,y);
if (a[x].lazy) xiangxia(x);
a[x].sum=a[2*x].sum+a[2*x+1].sum;
return;
}
long long find(int x, int l, int r)
{
if(a[x].l >= l && a[x].r <= r){return a[x].sum;}
if(a[x].r < l || a[x].l > r){return 0;}
if(a[x].lazy) xiangxia(x);
return find(x * 2, l, r) + find (x * 2 + 1, l ,r);
}
int main()
{
cin >> n;
jianshu(1, 1, n);
cin >> w;
for(int i = 1; i <= w; i++)
{
char iii;
cin >> iii;
if(iii == 'x')
{
long long x, y;
cin >> x >> y;
jiafa(1 ,x ,y);
}
else
{
long long x,y;
cin >> x >> y;
cout<<find(1, x, y)<<endl;
}
}
return 0;
}