社区讨论

RE求条

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

讨论操作

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

当前回复
25 条
当前快照
1 份
快照标识符
@mhjhqo56
此快照首次捕获于
2025/11/04 02:46
4 个月前
此快照最后确认于
2025/11/04 06:22
4 个月前
查看原帖
应该是add函数RE了,但蒟蒻看不出来
CPP
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
int ls(int p){return p<<1;}
int rs(int p){return p<<1|1;}
struct node{
	int l,r;
	ll lazy,sum;
}t[1000000];
int a[100005];
void Assignment(int p){t[p].sum=t[ls(p)].sum+t[rs(p)].sum;}
void Delaymark(int p,int v){
	t[p].sum=(t[p].r-t[p].l+1)*v;
	t[p].lazy=v;
}
void TransmitLazy(int p){
	if(t[p].lazy){
		Delaymark(ls(p),t[p].lazy);
		Delaymark(rs(p),t[p].lazy);
		t[p].lazy=0;
	}
}
void built(int p,int l,int r){
	t[p].l=l;
	t[p].r=r;
	if(l==r){
		t[p].sum=a[l];
		t[p].lazy=0;
        return ;
	}
	int mid=(l+r)/2;
	built(ls(p),l,mid);
	built(rs(p),mid+1,r);
	Assignment(p);
}
void add(int p,int st,int ed,int v){
	if(st<=t[p].l&&t[p].r>=ed){
		Delaymark(p,v);
		return ;
	}
	TransmitLazy(p);
	int mid=(t[p].l+t[p].r)/2;
	if(st<=mid)add(ls(p),st,ed,v);
	if(ed>mid)add(rs(p),st,ed,v);
	Assignment(p);
}
int find(int p,int st,int ed){
	if(st<=t[p].l&&ed>=t[p].r)return t[p].sum;
	TransmitLazy(p);
	int mid=(t[p].l+t[p].r)/2;
	int ans=0;
	if(st<=mid)ans+=find(ls(p),st,ed);
	if(ed>mid)ans+=find(rs(p),st,ed);
	Assignment(p);
	return ans;
}
int main(){
	ios::sync_with_stdio(false),cin.tie(0);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	built(1,1,n);
	for(int i=1;i<=m;i++){
		int z,x,y;
		cin>>z>>x>>y;
		if(z==1){
			int k;cin>>k;
			add(1,x,y,k);
		}else cout<<find(1,x,y)<<"\n";
	}
	return 0;
}
函数名比较猎奇

回复

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

正在加载回复...