社区讨论
95pts求条,WA on #19
P3372【模板】线段树 1参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mlhgn0z3
- 此快照首次捕获于
- 2026/02/11 11:18 上周
- 此快照最后确认于
- 2026/02/12 22:10 7 天前
不知道为什么WA了,复习线段树时写的,感觉和之前写得没什么区别就是WA了
CPP#include<bits/stdc++.h>
#define cin io
using namespace std;
typedef long long ll;
struct IO
{
char buf[1<<20],*p,*pp;
IO():p(buf),pp(buf){}
#define gc() (p==pp&&(pp=buf+fread(buf,1,1<<20,stdin),p=buf),p==pp?EOF:*p++)
template<typename T>IO&operator>>(T&x){x=0;char c=gc();bool f=0;while(c<'0'||c>'9')f|=(c=='-'),c=gc();while(c>='0'&&c<='9')x=x*10+(c^48),c=gc();if(f)x=-x;return*this;}
}io;
const int N=1e5+5;
int n,m;
int a[N];
struct Seg
{
#define ls (u<<1)
#define rs (u<<1|1)
struct Node
{
int l,r;
ll sum,tag;
}tr[N<<2];
inline void pushup(int u){tr[u].sum=tr[ls].sum+tr[rs].sum;}
inline void pushdown(int u)
{
if(tr[u].tag)
{
ll tag=tr[u].tag;
tr[ls].tag+=tag;
tr[rs].tag+=tag;
tr[ls].sum+=(tr[ls].r-tr[ls].l+1)*tag;
tr[rs].sum+=(tr[rs].r-tr[rs].l+1)*tag;
tr[u].tag=0;
}
}
void build(int u,int l,int r)
{
tr[u]={l,r,0,0};
if(l==r)
{
tr[u].sum=a[l];
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(u);
}
void update(int u,int l,int r,ll v)
{
if(l<=tr[u].l&&tr[u].r<=r)
{
tr[u].sum+=(tr[u].r-tr[u].l+1)*v;
tr[u].tag+=v;
return;
}
int mid=(tr[u].l+tr[u].r)>>1;
pushdown(u);
if(l<=mid) update(ls,l,r,v);
if(r>mid) update(rs,l,r,v);
pushup(u);
}
ll query(int u,int l,int r)
{
if(l<=tr[u].l&&tr[u].r<=r) return tr[u].sum;
pushdown(u);
ll res=0;
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid) res+=query(ls,l,r);
if(r>mid) res+=query(rs,l,r);
return res;
}
}seg;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
seg.build(1,1,n);
while(m--)
{
int op,l,r;
cin>>op>>l>>r;
if(op==1)
{
ll v;
cin>>v;
seg.update(1,l,r,v);
}
if(op==2) printf("%lld\n",seg.query(1,l,r));
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...