求助,萌新刚学线段树
查看原帖
求助,萌新刚学线段树
67618
haooo楼主2020/11/13 09:50

过了样例,下载了第一个数据,本地测试肉眼是对的

但交上去Wa了前7个点,RE了后3个点

#include<bits/stdc++.h>
#define ll long long
#define RT register
#define ull unsigned long long
using namespace std;
const int MAXN=1e5+5;

template <typename T>
inline void read(T &x){
	x=0; bool f=false; char ch=getchar();
	while(ch<'0'||ch>'9'){f=(ch='-'?true:f);ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	x=f?-x:x;
}
template <typename T>
inline void print(T x){
	if(x<0) putchar('-'),x=-x;
	if(x>=10) print(x/10);
	putchar(x%10+'0');
}

ll a[MAXN];
struct Seg_Tree{
	int l,r;
	ll sum,add;
	#define l(x) t[x].l
	#define r(x) t[x].r
	#define sum(x) t[x].sum
	#define add(x) t[x].add
}t[MAXN*4];
inline void pushup(int p){sum(p)=sum(p<<1)+sum(p<<1|1);}
inline void pushdown(int p){
	if(add(p)){
		add(p<<1)+=add(p);
		sum(p<<1)+=(r(p<<1)-l(p<<1)+1)*add(p);
		add(p<<1|1)+=add(p);		
		sum(p<<1|1)+=(r(p<<1|1)-l(p<<1|1)+1)*add(p);
		add(p)=0;
	}
}
void build(int p,int l,int r){
	l(p)=l,r(p)=r;
	if(l==r){
		add(p)=0;
		sum(p)=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
}
void modify(int p,int l,int r,ll d){
	if(l<=l(p)&&r(p)<=r){
		add(p)+=d;
		sum(p)+=(r(p)-l(p)+1)*d;
		return;
	}
	pushdown(p);
	int mid=(l(p)+r(p))>>1;
	if(mid>=l) modify(p<<1,l,r,d);
	if(mid<r) modify(p<<1|1,l,r,d);
	pushup(p);
}
ll ask(int p,int l,int r){
	if(l<=l(p)&&r(p)<=r)	return sum(p);
	int mid=(l(p)+r(p))>>1;
	ll ans=0;
	pushdown(p);
	if(l<=mid) ans+=ask(p<<1,l,r);
	if(r>mid) ans+=ask(p<<1|1,l,r);
	return ans;
}
int n,m;
int main(){
	read(n);read(m);
	for(int i=1;i<=n;i++) read(a[i]);
	build(1,1,n);
	while(m--){
		int op;read(op);
		if(op==1){
			int x,y;ll k;
			read(x),read(y),read(k);
			modify(1,x,y,k);
		}
		else{
			int x,y;
			read(x);read(y);
			print(ask(1,x,y));
			putchar('\n');
		}
//		for(int i=1;i<=n;i++){
//			cout<<ask(1,i,i)<<" ";
//		}
//		cout<<"\n";
	}
	return 0;
}
2020/11/13 09:50
加载中...