萌新刚学,样例WA,求助
查看原帖
萌新刚学,样例WA,求助
115668
y0y68tahs6楼主2020/5/8 21:40
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,m;
ll a[100005],tree[400005],tag[400005];
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline void build(int l,int r,int u){
	if(l==r){tree[u]=a[l];return;}
	int mid=l+r>>1;
	build(l,mid,ls(u));
	build(mid+1,r,rs(u));
	tree[u]=tree[ls(u)]+tree[rs(u)];
}
inline void flag(int l,int r,int u,ll k){
	tree[u]+=k*(r-l+1),tag[u]+=k;
}
inline void clear(int u,int l,int r){
	if(l==r)return;
	int mid=l+r>>1;
	flag(l,mid,u,tag[u]);
	flag(mid+1,r,u,tag[u]);
	tag[u]=0;
}
inline void add(int tl,int tr,int l,int r,int u,ll k){
	if(tl<=l&&tr>=r){
		tree[u]+=k*(r-l+1),tag[u]+=k;
		return;
	}
	clear(u,l,r);
	int mid=l+r>>1;
	if(tl<=mid)add(tl,tr,l,mid,ls(u),k);
	if(tr>mid)add(tl,tr,mid+1,r,rs(u),k);
}
inline ll get(int tl,int tr,int l,int r,int u){
	if(tl<=l&&tr>=r)return tree[u];
	int mid=l+r>>1;
	clear(u,l,r);
	ll cnt=0;
	if(tl<=mid)cnt+=get(tl,tr,l,mid,ls(u));
	if(tr>mid)cnt+=get(tl,tr,mid+1,r,rs(u));
	return cnt;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	build(1,n,1);
	while(m--){
		int op;
		scanf("%d",&op);
		if(op==1){
			int x,y;ll k;
			scanf("%d%d%lld",&x,&y,&k);
			add(x,y,1,n,1,k);
		}
		else{
			int x,y;
			scanf("%d%d",&x,&y);
			printf("%lld\n",get(x,y,1,n,1));
		}
	}
}

我几乎都调成第一篇题解了,但是样例一的最后一个输出总是12

2020/5/8 21:40
加载中...