社区讨论
萌新wa求调
P3372【模板】线段树 1参与者 4已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lth5hsye
- 此快照首次捕获于
- 2024/03/07 19:34 2 年前
- 此快照最后确认于
- 2024/03/07 21:41 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
const int M=100005;
int n,m;
int a[M];
struct Tree{
int l,r,add;
long long d;
}t[M*4];
void build(int p,int l,int r)
{
t[p].l=l;
t[p].r=r;
t[p].add=0;
if(l==r)
{
t[p].d=a[l];
return;
}
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
t[p].d=t[p*2].d+t[p*2+1].d;
}
void check(int p)
{
if(t[p].add)
{
t[p*2].add+=t[p].add;
t[p*2+1].add+=t[p].add;
t[p*2].d+=(t[p*2].r-t[p*2].l+1)*t[p].add;
t[p*2+1].d+=(t[p*2+1].r-t[p*2+1].l+1)*t[p].add;
t[p].add=0;
}
}
void change(int p,int l,int r,int add)
{
// cout<<p<<' ';
// if(p>n*4)return;
if(l<=t[p].l and r>=t[p].r)
{
t[p].add+=add;
t[p].d+=(t[p].r-t[p].l+1)*add;
return;
}
if(t[p].l==t[p].r)
{
t[p].d+=add;
return;
}
check(p);
int mid=(t[p].l+t[p].r)/2;
if(mid>=l)change(p*2,l,r,add);
if(mid<r)change(p*2+1,l,r,add);
t[p].d=t[p*2].d+t[p*2+1].d;
}
long long ask(int p,int l,int r)
{
// if(p>n*4)return 0;
if(l<=t[p].l and r>=t[p].r)return t[p].d;
if(t[p].l==t[p].r)return t[p].d;
check(p);
int mid=(t[p].l+t[p].r)/2;
long long rt=0;
if(mid>=l)rt+=ask(p*2,l,r);
if(mid< r)rt+=ask(p*2+1,l,r);
printf("%d[%d , %d] : %d\n",p,t[p].l,t[p].r,rt);
return rt;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)cin>>a[i];
while(m--)
{
int tp;
cin>>tp;
if(tp==1)
{
int x,y,k;
cin>>x>>y>>k;
change(1,x,y,k);
}
else
{
int x,y;
cin>>x>>y;
cout<<ask(1,x,y)<<'\n';
}
}
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...