社区讨论

加上关闭同步就会出问题

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@locsfss1
此快照首次捕获于
2023/10/30 18:59
2 年前
此快照最后确认于
2023/11/05 05:41
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct SegementTree{
	int l,r;
	long long sum;
	int p;
}t[400007];
long long a[100007];
void pushup(int id){
	t[id].sum=t[id<<1].sum+t[id<<1|1].sum;
	return;
}
void pushdown(int id){
	if(t[id].p){
		t[id<<1].p+=t[id].p;
		t[id<<1].sum+=t[id].p*(t[id<<1].r-t[id<<1].l+1);
		t[id<<1|1].p+=t[id].p;
		t[id<<1|1].sum+=t[id].p*(t[id<<1|1].r-t[id<<1|1].l+1);
		t[id].p=0;
	}
	return;
}
void build(int id,int l,int r){
	t[id].l=l;t[id].r=r;
	if(l==r){t[id].sum=a[l];return;}
	int mid=(l+r)>>1;
	build(id<<1,l,mid);build(id<<1|1,mid+1,r);
	pushup(id);
	return;
}
void add(int id,int l,int r,int k){
	if(l<=t[id].l&&t[id].r<=r){
		t[id].sum+=k*(t[id].r-t[id].l+1);
		t[id].p+=k;
		return;
	}
	pushdown(id);
	int mid=(t[id].l+t[id].r)>>1;
	if(l<=mid)add(id<<1,l,r,k);
	if(r>mid)add(id<<1|1,l,r,k);
	pushup(id);
	return;
}
long long get_sum(int id,int l,int r){
	if(l<=t[id].l&&t[id].r<=r)
		return t[id].sum;
	pushdown(id);
	int mid=(t[id].l+t[id].r)>>1;
	if(r<=mid)return get_sum(id<<1,l,r);
	else if (l>mid)return get_sum(id<<1|1,l,r);
	else return get_sum(id<<1,l,r)+get_sum(id<<1|1,l,r);
}
int Read();
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	n=Read();m=Read();
	for(int i=1;i<=n;++i)
		a[i]=Read();
	build(1,1,n);
	for(int i=1;i<=m;++i){
		int f;cin>>f;
		if(f==1){
			int x=Read(),y=Read(),k=Read(); 
			add(1,x,y,k);
		}
		else {
			int x=Read(),y=Read();
			cout<<get_sum(1,x,y)<<"\n";
		}
	}
	return 0;
}
int Read(){
	char ch=getchar();
	int res=0,flag=1;
	while(ch<'0'||ch>'9'){
		ch=='-'?flag=-1:ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		res=(res<<3)+(res<<1)+ch-'0';
		ch=getchar();
	}
	return flag*res;
}
如题,如果去掉 ios 那几行,就行了,如果不删,运行都会出问题。求助

回复

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

正在加载回复...