蒟蒻求调线段树,样例都没过
  • 板块学术版
  • 楼主lyhqwq
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/5/3 19:30
  • 上次更新2023/11/4 23:46:54
查看原帖
蒟蒻求调线段树,样例都没过
100690
lyhqwq楼主2021/5/3 19:30
#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
#define il inline
const int MAXN=1e5+5;
using namespace std;
ll opt;
ll n,m,x,y,k;
ll a[MAXN],ans[MAXN<<2],lazy[MAXN<<2];
il ll lc(int x){
	return x<<1;
}
il ll rc(int x){
	return x<<1|1;
}
void push_down(ll rt,ll ln,ll rn){
	if(lazy[rt]){
		lazy[lc(rt)]+=lazy[rt];
		lazy[rc(rt)]+=lazy[rt];
		ans[lc(rt)]+=lazy[rt]*ln;
		ans[rc(rt)]+=lazy[rt]*rn;
	}
	lazy[rt]=0;
}
void push_up(ll rt){
	ans[rt]=ans[lc(rt)]+ans[rc(rt)];
}
void build(ll l,ll r,ll rt){
	lazy[rt]=0;
	if(l==r){
		ans[rt]=a[l];
		return;
	}
	ll m=(l+r)>>1;
	build(lc(rt),l,m);
	build(rc(rt),m+1,r);
	push_up(rt);
}
void update(ll L,ll R,ll l,ll r,ll v,ll rt){
	if(L<=l&&r<=R){
		ans[rt]+=v*(r-l+1);
		lazy[rt]+=v;
		return;
	}
	push_down(rt,m-l+1,r-m);
	ll m=(l+r)>>1;
	if(L<=m)
		update(L,R,l,m,v,lc(rt));
	if(R>m)
		update(L,R,m+1,r,v,rc(rt));
	push_up(rt);
}
ll query(ll L,ll R,ll l,ll r,ll rt){
	if(L<=l&&r<=R){
		return ans[rt];
	}
	ll m=(l+r)>>1;
	push_down(rt,m-l+1,r-m);
	ll Ans=0;
	if(L<=m)
		Ans+=query(L,R,l,m,lc(rt));
	if(R>m)
		Ans+=query(L,R,m+1,r,rc(rt));
	return Ans;
}
int main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	for(ll i=1;i<=m;i++){
		scanf("%lld",&opt);
		switch(opt){
			case 1:{
				scanf("%lld%lld%lld",&x,&y,&k);
				update(x,y,1,n,k,1); 
				break;
			}
			case 2:{
				scanf("%lld%lld",&x,&y);
				printf("%lld\n",query(x,y,1,n,1));
				break;
			}
		}
	}
	return 0;
}

2021/5/3 19:30
加载中...