求马蜂锐评
  • 板块灌水区
  • 楼主F1NE
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/10/23 16:14
  • 上次更新2024/10/23 18:13:17
查看原帖
求马蜂锐评
1163927
F1NE楼主2024/10/23 16:14

rt,写的是线段树

#include<bits/stdc++.h>
#define _ls p<<1
#define _rs p<<1|1
#define now sgt[p]
#define ls sgt[_ls]
#define rs sgt[_rs]
typedef long long ll;
using namespace std;
const int maxi=1e5+9;
struct node{
	ll sum,laz;
	int s,t,m;
}sgt[maxi<<2];
int N,M,a[maxi],L,R,D;
inline void update(int p){now.sum=ls.sum+rs.sum;}
void build(int s,int t,int p){
	now.s=s,now.t=t,now.m=(s+t)>>1;
	if(s==t){
		now.sum=1ll*a[s];return;
	}
	build(s,now.m,_ls),build(now.m+1,t,_rs);
	update(p);
	return;
}
inline void pushdown(int p){
	if(now.laz){
		ls.sum+=now.laz*(ls.t-ls.s+1);
		rs.sum+=now.laz*(rs.t-rs.s+1);
		ls.laz+=now.laz,rs.laz+=now.laz;
		now.laz=0;
	}
	return;
}
void wt(int p){
	if(L<=now.s&&now.t<=R){
		now.sum+=1ll*D*(now.t-now.s+1);
		now.laz+=1ll*D;
		return;
	}
	pushdown(p);
	if(L<=now.m)wt(_ls);
	if(now.m<R)wt(_rs);
	update(p);
	return;
}
ll rd(int p){
	if(L<=now.s&&now.t<=R)return now.sum;
	ll ans=0;
	pushdown(p);
	if(L<=now.m)ans+=rd(_ls);
	if(now.m<R)ans+=rd(_rs);
	update(p);
	return ans;
}
int main(){
	cin>>N>>M;
	for(int i=1;i<=N;i++)scanf("%d",&a[i]);
	build(1,N,1);
	for(int i=1,op;i<=M;i++){
		scanf("%d",&op);
		if(op==1){
			scanf("%d%d%d",&L,&R,&D);
			wt(1);
		}
		if(op==2){
			scanf("%d%d",&L,&R);
			printf("%lld\n",rd(1));
		}
	}
	return 0;
} 
2024/10/23 16:14
加载中...