社区讨论

只A了一个点,谁能帮忙看一下哪里出问题了

P3372【模板】线段树 1参与者 4已保存回复 12

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
12 条
当前快照
1 份
快照标识符
@mi7cmm5j
此快照首次捕获于
2025/11/20 19:29
4 个月前
此快照最后确认于
2025/11/20 21:58
4 个月前
查看原帖
CPP
#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
const ll N=100010;
ll n,m,x,y,k;
struct T{
	ll l,r,len,val,lazy;
}e[N<<2];
inline ll read(){
	ll p=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')p=p*10+c-'0',c=getchar();
	return p*f;
}
void bui(int d,ll L,ll R){
	e[d].l=L;e[d].r=R;e[d].len=R-L+1;
	e[d].lazy=0;
	if(L==R){
		e[d].val=read();
		return ;
	}
	ll mid=(L+R)>>1;
	bui(d<<1,L,mid);
	bui(d<<1|1,mid+1,R);
	e[d].val=e[d<<1].val+e[d<<1|1].val;
}
void ch(int d,ll L,ll R,ll v){
	if(L>e[d].r||R<e[d].l) return ;
	if(e[d].l>=L&&e[d].r<=R){
		e[d].val+=e[d].len*v;
		e[d].lazy+=v;
		return ;
	}
	ch(d<<1,L,R,v);ch(d<<1|1,L,R,v);
	e[d].val=e[d<<1].val+e[d<<1|1].val;
}
void push_down(int d){
	e[d<<1].val+=e[d].lazy*e[d<<1].len;
	e[d<<1|1].val+=e[d].lazy*e[d<<1|1].len;
	e[d<<1].lazy+=e[d].lazy;
	e[d<<1|1].lazy+=e[d].lazy;
	e[d].lazy=0;
}
ll find(int d,ll L,ll R){
	if(L>e[d].r||R<e[d].l) return 0;
	if(e[d].l>=L&&e[d].r<=R) return e[d].val;
	push_down(d);
	ll ans=0;
	ans+=find(d<<1,L,R);
	ans+=find(d<<1|1,L,R);
	return ans;
}
int main(){
	freopen("test.txt","r",stdin);
	n=read();m=read();
	bui(1,1,n);
	while(m--){
		k=read();x=read();y=read();
		if(k>1){
			printf("%lld\n",find(1,x,y));
			continue ;
		}
		k=read();
		ch(1,x,y,k);
	}
	return 0;
}

回复

12 条回复,欢迎继续交流。

正在加载回复...