单点修改
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m;
const ll maxn=2e5+10;
ll a[maxn],f[maxn*4];
ll big=0;
void build(ll k,ll l,ll r){
if(l==r){
f[k]=a[l];
return ;
}
ll mid=l+(r-l)/2;
build(k+k,l,mid);
build(k+k+1,mid+1,r);
f[k]=f[k+k]+f[k+k+1];
}
void add(ll id,ll l,ll r,ll x,ll k){
f[id]+=k;
if(l==r) return ;
ll mid=l+(r-l)/2;
if(x<=mid) add(id+id,l,mid,x,k);
else add(id+id+1,mid+1,r,x,k);
}
ll cal(ll id,ll l,ll r,ll x,ll y){
if(l==x&&r==y) return f[id];
ll mid=l+(r-l)/2;
if(y<=mid) return cal(id+id,l,mid,x,y);
else if(x>mid) return cal(id+id+1,mid+1,r,x,y);
else return cal(id+id,l,mid,x,mid)+cal(id+id+1,mid+1,r,mid+1,y);
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin>>n>>m;
for(ll i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
for(ll i=1;i<=m;i++){
ll t,x,k,y;
cin>>t;
if(t==1){
cin>>x>>k;
add(1,1,n,x,k);
}else {
cin>>x>>y;
cout<<cal(1,1,n,x,y)<<endl;
}
}
return 0;
}
区间修改
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn=1e5+10;
ll n,m;
ll a[maxn],f[maxn*4],v[maxn*4];
void build(ll id,ll l,ll r){
if(l==r){
f[id]=a[l];
return ;
}
ll mid=l+(r-l)/2;
build(id+id,l,mid);
build(id+id+1,mid+1,r);
f[id]=f[id+id]+f[id+id+1];
}
void add(ll id,ll l,ll r,ll x,ll y,ll k){
if(l==x&&r==y){
v[id]+=k;
return ;
}
f[id]+=(y-x+1)*k;
ll mid=l+(r-l)/2;
if(y<=mid) add(id+id,l,mid,x,y,k);
else if(x>mid) add(id+id+1,mid+1,r,x,y,k);
else {
add(id+id,l,mid,x,mid,k);
add(id+id+1,mid+1,r,mid+1,y,k);
}
}
ll cal(ll id,ll l,ll r,ll x,ll y,ll p){
p+=v[id];
if(l==x&&r==y) {
return p*(y-x+1)+f[id];
}
ll mid=l+(r-l)/2;
if(y<=mid) return cal(id+id,l,mid,x,y,p);
else if(x>mid) return cal(id+id+1,mid+1,r,x,y,p);
else return cal(id+id,l,mid,x,mid,p)+cal(id+id+1,mid+1,r,mid+1,y,p);
}
int main()
{
cin>>n>>m;
for(ll i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
for(ll i=1;i<=m;i++){
ll t,x,y,k;
cin>>t;
if(t==1){
cin>>x>>y>>k;
add(1,1,n,x,y,k);
}else {
cin>>x>>y;
cout<<cal(1,1,n,x,y,0)<<endl;
}
}
return 0;
}
标记下传做法
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn=1e5+10;
ll n,m;
ll a[maxn],f[maxn*4],v[maxn*4];
void build(ll id,ll l,ll r){
if(l==r){
f[id]=a[l];
return ;
}
ll mid=l+(r-l)/2;
build(id+id,l,mid);
build(id+id+1,mid+1,r);
f[id]=f[id+id]+f[id+id+1];
}
void add(ll id,ll l,ll r,ll x,ll y,ll k){
if(l==x&&r==y){
v[id]+=k;
return ;
}
if(v[id]){
v[id+id]+=v[id];
v[id+id+1]+=v[id];
v[id]=0;
}
ll mid=l+(r-l)/2;
if(y<=mid){
add(id+id,l,mid,x,y,k);
}else if(x>mid){
add(id+id+1,mid+1,r,x,y,k);
}else {
add(id+id,l,mid,x,mid,k);
add(id+id+1,mid+1,r,mid+1,y,k);
}
f[id]=f[id+id]+v[id+id]*(mid-l+1)+f[id+id+1]+v[id+id+1]*(r-mid);
}
ll cal(ll id,ll l,ll r,ll x,ll y){
if(l==x&&r==y){
return f[id]+v[id]*(r-l+1);
}
if(v[id]){
v[id+id]+=v[id];
v[id+id+1]+=v[id];
v[id]=0;
}
ll res=0;
ll mid=l+(r-l)/2;
if(y<=mid) res=cal(id+id,l,mid,x,y);
else if(x>mid) res=cal(id+id+1,mid+1,r,x,y);
else res=cal(id+id,l,mid,x,mid)+cal(id+id+1,mid+1,r,mid+1,y);
f[id]=f[id+id]+v[id+id]*(mid-l+1)+f[id+id+1]+v[id+id+1]*(r-mid);
return res;
}
int main()
{
cin>>n>>m;
for(ll i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
for(ll i=1;i<=m;i++){
ll t,x,y,k;
cin>>t;
if(t==1){
cin>>x>>y>>k;
add(1,1,n,x,y,k);
}else {
cin>>x>>y;
cout<<cal(1,1,n,x,y)<<endl;
}
}
return 0;
}
------------------------------------------------------------------------------------------------