P3372RE0qwqqwq

#include<bits/stdc++.h>
using namespace std;
struct node{
    int sum;
    int lazy;
}tree[400005];
int n,a[100001],x,y,m,v,aa;
void jianshu(int id,int l,int r){
	if(l==r){
		tree[id].sum=a[l];
		return ;
	}
	int mid=(l+r)/2;
	jianshu(id*2,l,mid);
	jianshu(id*2+1,mid+1,r);
	tree[id].sum=(tree[id*2].sum+tree[id*2+1].sum);
}
void xiafa(int id,int l,int r){
    if(tree[id].lazy){
    	int mid=(l+r)/2;
        tree[id*2].lazy+=tree[id].lazy;
        tree[id*2].sum+=(tree[id].lazy*(mid-l+1));
        tree[id*2+1].lazy+=tree[id].lazy;
        tree[id*2+1].sum+=(tree[id].lazy*(r-mid+1));
        tree[id].lazy=0;
    }
}
void qjgx(int id,int l,int r){
    if(l<=x&&y<=r){
        tree[id].lazy+=v;
        tree[id].sum+=v*(r-l+1);
    }
    xiafa(id,l,r);
    int mid=(l+r)/2;
    if(x<=mid) qjgx(id*2,l,mid);
	if(y>mid) qjgx(id*2+1,mid+1,r);
	tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
int find(int id,int l,int r){
	if(l<=x&&y<=r) return tree[id].sum;
    xiafa(id,l,r);
	int ma=0,mid=(l+r)/2;
	if(x<=mid) ma+=find(id*2,l,mid);
	if(y>mid) ma+=find(id*2+1,mid+1,r);
	return ma;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	jianshu(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>aa;
		if(aa==2){
			cin>>x>>y;
			cout<<find(1,1,n)<<endl;
		}
		else{
			cin>>x>>y>>v;
			qjgx(1,1,n);
		}
	}
}

悬赏一个解决方案和五个赞

在qjgx和find中,l、r是操作区间,不是当前节点维护的区间

我*普及有那么难吗

没,这是luogu的,不过应该和普及+难度差不多

线段树普及家学了么

(帖子已被作者删除)

(⊙o⊙)…,一直到我看到我自己的名字才反应过来

线段树还好

对的

还好就来帮我调

模板建议直接看题解。这个调了没意义。

其实我板子都是直接抄题解改码风的()

@stringdp100005 6

已解决。
问题1:没开long long
问题2:我**竟然忘写return 了!

好多问题!

1 个赞