本地跑的答案是对的,交上去确实错的……
查看原帖
本地跑的答案是对的,交上去确实错的……
209837
ZeroJ楼主2021/7/11 23:12

请各位大佬帮忙看看啊,问题如标题所示↓

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#define ll long long 
using namespace std;
const int MAXN=1e5+10;
int n,m;
ll a[MAXN]={0},tree[4*MAXN],tag[4*MAXN];

inline int ls(int x){
	return x<<1;
} 
inline int rs(int x){
	return x<<1|1;
}
inline void sum(int p){
	tree[p]=tree[ls(p)]+tree[rs(p)];
}
inline void build(int p,int l,int r){ 
	if(l==r){
		tree[p]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	sum(p);
}
inline void lazy_tag(int p,int l,int r,ll w){
	tag[p]+=w;
	tree[p]+=w*(r-l+1);
}
inline void push_down(int p,int l,int r){
	int mid=(l+r)>>1;
	lazy_tag(ls(p),l,mid,tag[p]);
	lazy_tag(rs(p),mid+1,r,tag[p]);
	tag[p]=0;
}
inline ll query(int p,int l,int r,int L,int R){
	if(L<=l&&r<=R){
		return tree[p];
	}
	ll ans=0;
	int mid=(l+r)>>1;
	push_down(p,l,r);
	if(L<=mid)ans+=query(ls(p),l,mid,L,R);
	if(R>mid)ans+=query(rs(p),mid+1,r,L,R);
	return ans;
} 
inline void update(int p,int l,int r,int L,int R,ll w){
	if(L<=l&&r<=R){
		tree[p]+=w*(r-l+1);
		tag[p]+=w;
		return ;
	}
	push_down(p,l,r);
	int mid=(l+r)>>1;
	if(L<=mid)update(ls(p),l,mid,L,R,w);
	if(R>mid)update(rs(p),mid+1,r,L,R,w);
	sum(p);
}
int main(){
	memset(tree,0,sizeof(tree));
	memset(tag,0,sizeof(tag));
	cin>>n>>m;
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	build(1,1,n);
	
	int opt,x,y;
	ll k;
	while(m--){
		scanf("%d%d%d",&opt,&x,&y);
		if(opt==1){
			scanf("%d",&k);
			update(1,1,n,x,y,k);
		}
		else {
			printf("%lld\n",query(1,1,n,x,y));
		}
	}
	return 0;
}


希望各位大佬能给出解决方案!

2021/7/11 23:12
加载中...