求助(玄关)
  • 板块题目总版
  • 楼主Danny_chan
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/9/29 20:49
  • 上次更新2024/9/29 22:12:22
查看原帖
求助(玄关)
1032960
Danny_chan楼主2024/9/29 20:49

问题一:

这题

代码(10分):

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100010],n,m,t[400010],f1[400010];
void push(int l,int r,int fa){
	int mid=(l+r)/2;
	t[fa*2]+=f1[fa]*(mid-l+1);
	f1[fa*2]+=f1[fa];
	t[fa*2+1]+=f1[fa]*(r-mid);
	f1[fa*2+1]+=f1[fa];
	f1[fa]=0;
}
void b(int fa,int l,int r){
	if(l==r){
		t[fa]=a[l];
		return ;
	}
	int mid=(l+r)/2;
	b(fa*2,l,mid);
	b(fa*2+1,mid+1,r);
	t[fa]=t[fa*2]+t[fa*2+1];
}
int f(int ql,int qr,int l,int r,int fa){
	int ans=0;
	if(ql<=l&&qr>=r){
		return t[fa];
	}
	int mid=(l+r)/2;
	push(l,r,fa);
	if(ql<=mid){
		ans+=f(ql,qr,l,mid,fa*2);	
	}
	if(qr>mid){
		ans+=f(ql,qr,mid+1,r,fa*2+1);
	}
	return ans;
}
void c(int ql,int qr,int l,int r,int fa,int k){
	if(ql<=l&&qr>=r){
		t[fa]+=k*(r-l+1);
		f1[fa]=k;
		return ;
	}
	
 	push(l,r,fa);
 	int mid=(l+r)/2;
 	if(ql<=mid) c(ql,qr,l,mid,fa*2,k);
 	if(qr>mid) c(ql,qr,mid+1,r,fa*2+1,k);
 	t[fa]=t[fa*2]+t[fa*2+1];
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	b(1,1,n);
	while(m--){
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1){
			int z;
			cin>>z;
			c(x,y,1,n,1,z);
		}
		if(op==2){
			cout<<f(x,y,1,n,1)<<endl;
		}
	}
	return 0; 
}

问题二:

2024/9/29 20:49
加载中...