AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 商店
  • 应用
  • 文章
    • 题解
    • 分享
    • 问答
  • 吐槽
  • 登录/注册

原文

作者: 作者的头像   wert_nzy ,  2022-08-06 07:39:41 ,  所有人可见 ,  阅读 13


1


求助 蒟蒻第一次敲线段树:[题目](https://www.luogu.com.cn/problem/P3372) 应该是ask_the_answer函数出了错,但哪里错了呀,调了好久(哭) #include<bits/stdc++.h> using namespace std; typedef long long ll; ll n,m,a[100010]; struct node{ ll l,r; ll sum; ll lazy_flag; }c[400050]; void build(ll x,ll l,ll r){ c[x].l=l; c[x].r=r; if(l==r){ c[x].sum=a[l]; return ; } ll mid=(l+r)>>1; c[x*2].sum=(x*2,l,mid); c[x*2+1].sum=(x*2+1,mid+1,r); c[x].sum=c[x*2].sum+c[x*2+1].sum; } void lazy_down(ll x){ if(c[x].lazy_flag!=0){ ll add=c[x].lazy_flag; c[x*2].sum+=add*(c[x*2].r-c[x*2].l+1); c[x*2].lazy_flag+=add; c[x*2+1].sum=add*(c[x*2+1].r-c[x*2+1].l+1); c[x*2+1].lazy_flag+=add; c[x].lazy_flag=0; } } void find(ll i,ll l,ll r,ll k){ if(c[i].l>=l&&c[i].r<=r){ c[i].lazy_flag+=k; c[i].sum+=k*(c[i].r-c[i].l+1); return ; } lazy_down(i); ll mid=(c[i].l+c[i].r)>>1; if(l<=mid){ find(i*2,l,r,k); } if(r>mid){ find(i*2+1,l,r,k); } c[i].sum=c[i*2].sum+c[i*2+1].sum; } ll ask_the_answer(ll i,ll l,ll r){ ll ans=0; if(c[i].l>=l&&c[i].r<=r){ return c[i].sum; } lazy_down(i); ll mid=(c[i].l+c[i].r)>>1; if(l<=mid){ ans+=ask_the_answer(i*2,l,r); } if(r>mid){ ans+=ask_the_answer(i*2+1,l,r); } return ans; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); } build(1,1,n); ll k,x,y,z; for(int i=1;i<=m;i++){ scanf("%lld%lld%lld",&k); if(k==1){ scanf("%lld%lld%lld",&x,&y,&z); find(1,x,y,z); }else{ scanf("%lld%lld",&x,&y); cout<<ask_the_answer(1,x,y)<<endl; } } return 0; }

1 评论


用户头像
wert_nzy   9天前     回复

已解决
此帖完结(撒花)


你确定删除吗?
1024
x

© 2018-2022 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息