样例都过不了,求调Orz
查看原帖
样例都过不了,求调Orz
470299
fang20081114楼主2024/8/13 16:31
//洛谷P3372 线段树模板 
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
ll n,m,x,y,k,op;
ll number[N];
struct node{
	ll left,right;
	ll sum;
	ll tag;
} tree[N<<2];
void push_up(ll rt){
	tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
}
inline void push_down(ll l,ll r,ll rt){
/*	ll mid=l+r>>1;
	add(l,mid,rt<<1,tree[rt].tag);
	add(mid+1,r,rt<<1|1,tree[rt].tag);
	tree[rt].tag=0;*/
	if (tree[rt].tag){
		ll m=l+r>>1;
		ll lson= rt<<1;
		ll rson= rt<<1|1;
		tree[lson].tag += tree[rt].tag;
		tree[rson].tag += tree[rt].tag;
		tree[lson].sum += tree[rt].tag * (tree[lson].right-tree[lson].left+1);
		tree[rson].sum += tree[rt].tag * (tree[rson].right-tree[rson].left+1);
		tree[rt].tag = 0;
	}
}
void build_tree(ll a,ll b,ll rt){
	tree[rt].tag=0;//懒标记初始化 
	tree[rt].left=a;
	tree[rt].right=b;
	if(a==b){
		tree[rt].sum=number[a];
		return ;
	}
	ll mid=a+b>>1;
	build_tree(a,mid,rt<<1);
	build_tree(mid+1,b,rt<<1|1);
	push_up(rt);
} 
void update(ll rt,ll a,ll b,ll num){
	if(tree[rt].right<a || tree[rt].left>b)  return ;
	if(a<=tree[rt].left && tree[rt].right<=b){//当前节点在区间内 
		tree[rt].sum+=num*(tree[rt].right-tree[rt].left+1);
		tree[rt].tag+=num;
		//cout<<tree[rt].tag<<"||"<<tree[rt].sum<<endl; 
	//	cout<<tree[rt].left<<" "<<tree[rt].right<<" "<<rt<<"))"<<tree[rt].tag<<endl;
	//	push_down(tree[rt].left,tree[rt].right,rt);
		return ; 
	}
	push_down(tree[rt].left,tree[rt].right,rt);
	ll mid=tree[rt].left+tree[rt].right>>1;
	if(a<=mid)
		update(rt<<1,a,b,num);
	if(mid<=b)
		update(rt<<1|1,a,b,num);
	push_up(rt); 
	return ;
}
ll query(ll rt,ll a,ll b){
	if(a<=tree[rt].left && tree[rt].right<=b){
		return tree[rt].sum;
	}
	ll mid=tree[rt].left+tree[rt].right>>1;
	ll result=0;
	push_down(rt,a,b);
	if(a<=mid)
		result+=query(rt<<1,a,mid);
	if(mid<b)
		result+=query(rt<<1|1,mid+1,b);
	return result;
}
int main(){
//	memset(tree,0,sizeof tree);
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=n;i++) scanf("%lld",&number[i]);
	build_tree(1,n,1);
//	for(int i=1;i<=n*2;i++) cout<<tree[i].sum<<" ";
//	puts(" ");
	while(m--){
		scanf("%lld",&op);
		scanf("%lld%lld",&x,&y);
		if(op==1){
			scanf("%lld",&k);
			update(1,x,y,k);
		}else if(op==2){
			int ans=query(1,x,y);
			printf("%lld\n",ans);
		}//for(int i=1;i<=n*4;i++) cout<<tree[i].sum<<" ";
		//	puts(" ");
	}
	return 0;
}
2024/8/13 16:31
加载中...