听灌佬多
  • 板块灌水区
  • 楼主wang_si_yu
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/9/13 18:31
  • 上次更新2024/9/13 21:32:38
查看原帖
听灌佬多
671857
wang_si_yu楼主2024/9/13 18:31

不懂就问

这个 tagtag 数组是干什么的?

(整个代码敲了好几遍,就这一个不知道了)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int Maxn=100005;
int a[Maxn],tag[Maxn<<2],ans[Maxn<<2],n,m,op,x,y,k;
inline int ls(int p){
	return p<<1;
}
inline int rs(int p){
	return p<<1|1;
}
void push_up(int p){
	ans[p]=ans[ls(p)]+ans[rs(p)];
}
void build(int p,int l,int r){
	tag[p]=0;
	if(l==r){
		ans[p]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
}
void f(int p,int l,int r,int k){
	tag[p]+=k;
	ans[p]+=(r-l+1)*k;
}
inline void push_down(int p,int l,int r){
	int mid=(l+r)>>1;
	f(ls(p),l,mid,tag[p]);
	f(rs(p),mid+1,r,tag[p]);
	tag[p]=0;
}
void update(int ml,int mr,int p,int l,int r,int k){
	if(ml<=l&&mr>=r){
		ans[p]+=(r-l+1)*k;
		tag[p]+=k;
		return;
	}
	int mid=(l+r)>>1;
	push_down(p,l,r);
	if(ml<=mid)update(ml,mr,ls(p),l,mid,k);
	if(mr>mid)update(ml,mr,rs(p),mid+1,r,k);
	push_up(p);
}
int query(int qx,int qy,int l,int r,int p){
	int res=0;
	if(qx<=l&&qy>=r){
		return ans[p];
	}
	int mid=(l+r)>>1;
	if(qx<=mid)res+=query(qx,qy,l,mid,ls(p));
	if(qy>mid)res+=query(qx,qy,mid+1,r,rs(p));
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while(m--){
		cin>>op>>x>>y;
		if(op==1){
			cin>>k;
			update(x,y,1,1,n,k);
		}
		else cout<<query(x,y,1,n,1)<<endl;
	}
} 
2024/9/13 18:31
加载中...