样例第三个点不知道为什么输出16,求助!
查看原帖
样例第三个点不知道为什么输出16,求助!
261262
WaltVBAlston楼主2020/10/18 21:03

如题,萌新刚学懒标记,但是怎么都查不出来问题,还望大佬们指教``` #include struct node{ int start,end,val,tag; }tree[400005]; int a[100005]; void build(int k,int L,int R){ tree[k].start=L,tree[k].end=R; if(L==R){ tree[k].val=a[L]; return; } int mid=(L+R)/2; build(2k,L,mid); build(2k+1,mid+1,R); tree[k].val=tree[2k].val+tree[2k+1].val; return; } int query(int k,int L,int R){ if(tree[k].start>R||tree[k].end<L) return 0; if(tree[k].start==tree[k].end) return tree[k].val; if(tree[k].start>=L&&tree[k].end<=R) return tree[k].val; return query(2k,L,R)+query(2k+1,L,R); } void pushdown(int k){ tree[2k].tag+=tree[k].tag; tree[2k+1].tag+=tree[k].tag; tree[2k].val+=tree[k].tag(tree[2k].end-tree[2k].start+1); tree[2k+1].val+=tree[k].tag(tree[2k+1].end-tree[2k+1].start+1); tree[k].tag=0; } void update(int k,int L,int R,int x){ if(tree[k].end<L||tree[k].start>R) return; if(tree[k].end<=R&&tree[k].start>=L){ tree[k].tag+=x; tree[k].val+=x*(tree[k].end-tree[k].start+1); return; } pushdown(k); update(2k,L,R,x); update(2k+1,L,R,x); tree[k].val=tree[k2].val+tree[k2+1].val; return; } int n,p,x,y,k,t; int main(){ scanf("%d%d",&n,&p); for(int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,1,n); while(p--){ scanf("%d",&t); if(t==1){ scanf("%d%d%d",&x,&y,&k); update(1,x,y,k); } else{ scanf("%d%d",&x,&y); printf("%d\n",query(1,x,y)); } } return 0; }

2020/10/18 21:03
加载中...