求助,MnZn刚学线段树
查看原帖
求助,MnZn刚学线段树
140360
MeowScore楼主2021/10/17 09:46

#3 WA On line 6837

其余点 AC

求助qwq

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m;
const ll N=1000100;
ll a[N];
ll dd[N];
struct Seg{
	ll sum;
	ll tag;
}st[N*4];
void build(ll root,ll l,ll r){
	if(l==r){
		st[root].sum=dd[l];
		return;
	}
	ll mid=(l+r)/2;
	build(root*2,l,mid);	
	build(root*2+1,mid+1,r);
	st[root].sum=st[root*2].sum+st[root*2+1].sum;
}
void push_down(ll root,ll l,ll r){
	if(l==r){
		st[root].tag=0;
		return;
	}
	ll mid=(l+r)/2;
	st[root*2].sum+=st[root].tag*(mid-l+1);
	st[root*2].tag+=st[root].tag;
	st[root*2+1].sum+=st[root].tag*(r-mid);
	st[root*2+1].tag+=st[root].tag;
	st[root].tag=0;
	st[root].sum=st[root*2].sum+st[root*2+1].sum;
 }
void add(ll root,ll l,ll r,ll x,ll y,ll k){
	if(l>=x&&r<=y){
		st[root].tag+=k;
		st[root].sum+=k*(r-l+1);
		return;
	}
	push_down(root,l,r);
	ll mid=(l+r)/2;
	if(mid>=x)
		add(root*2,l,mid,x,y,k);
	if(mid+1<=y)
		add(root*2+1,mid+1,r,x,y,k);
	st[root].sum=st[root*2].sum+st[root*2+1].sum;
}
ll ask(ll root,ll l,ll r,ll x,ll y){
	if(l>=x&&r<=y)
		return st[root].sum;
	push_down(root,l,r);
	ll mid=(l+r)/2;
	ll ans=0;
	if(mid>=x)
		ans+=ask(root*2,l,mid,x,y);
	if(mid+1<=y)
		ans+=ask(root*2+1,mid+1,r,x,y);
	return ans;
}
int main(){
//	freopen("无聊的数列.in","r",stdin);
//	freopen("无聊的数列.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		dd[i]=a[i]-a[i-1];
	}
	build(1,1,n);
	ll opt,l,r;
	ll k,d;
	ll p;
	for(int i=1;i<=m;i++){
		scanf("%lld",&opt);
		if(opt==1){
			scanf("%lld%lld%lld%lld",&l,&r,&k,&d);
			if(l==r){
				add(1,1,n,l,l,k);
				add(1,1,n,l+1,l+1,-k);
			}
			else{
				add(1,1,n,l,l,k);
				add(1,1,n,l+1,r,d);
				if(r!=n)
					add(1,1,n,r+1,r+1,(ll)(-(k+d*(r-l))));
			}
		}
		if(opt==2){
			scanf("%lld",&p);
			printf("%lld\n",ask(1,1,n,1,p));
		}
	}
	return 0;
}
2021/10/17 09:46
加载中...