样例过了,0分WA求条,调好必关注
查看原帖
样例过了,0分WA求条,调好必关注
563912
luyuxuan11楼主2024/8/8 15:06
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
    return x*f;
}
#define int long long 
#define ls x<<1
#define rs x<<1|1
struct h{
	int l,r,val,lac,laj;
};
int mod;
h tree[400005];
int a[100005];
void build(int x,int l,int r){
	tree[x].l=l;
	tree[x].r=r;
	tree[x].lac=1;
	tree[x].laj=0;
	if(l==r){
		tree[x].val=a[l];
		tree[x].val%=mod;
		return;
	}
	int mid=l+r>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	tree[x].val=(tree[ls].val+tree[rs].val)%mod;
}
void pushdown(int x){
	tree[ls].val=(tree[x].lac*tree[ls].val+(tree[x].laj*(tree[ls].r-tree[ls].l+1)))%mod;
	tree[rs].val=(tree[x].lac*tree[rs].val+(tree[x].laj*(tree[rs].r-tree[rs].l+1)))%mod;

	tree[ls].lac=(tree[x].lac*tree[ls].lac)%mod;
	tree[rs].lac=(tree[x].lac*tree[rs].lac)%mod;

	tree[ls].laj=(tree[ls].laj*tree[x].lac+tree[x].laj)%mod;
	tree[rs].laj=(tree[rs].laj*tree[x].lac+tree[x].laj)%mod;

	tree[x].lac=1;
	tree[x].laj=0;
}
void change1(int x,int l,int r,int k){
    if(tree[x].r<l||tree[x].l>r){
        return ;
    }
	if(tree[x].l>=l&&tree[x].r<=r){
		tree[x].val=(tree[x].val*k)%mod;
		tree[x].lac=(tree[x].lac*k)%mod;
		tree[x].laj=(tree[x].laj*k)%mod;
		return;
	}
	pushdown(x);
	int mid=(tree[x].l+tree[x].r)>>1;
	change1(ls,l,mid,k);
	change1(rs,mid,r,k);
	tree[x].val=(tree[ls].val+tree[rs].val)%mod;
}
void change2(int x,int l,int r,int k){
    if(tree[x].r<l||tree[x].l>r){
        return ;
    }
	if(tree[x].l>=l&&tree[x].r<=r){
		tree[x].val=(tree[x].val+(k*(tree[x].r-tree[x].l+1)))%mod;
		tree[x].laj=(tree[x].laj+k)%mod;
		return;
	}
	int mid=(tree[x].l+tree[x].r)>>1;
	pushdown(x);
	change2(ls,l,mid,k);
	change2(rs,mid+1,r,k);
	tree[x].val=(tree[ls].val+tree[rs].val)%mod;
}
int query(int x,int l,int r){
    if(tree[x].r<l||tree[x].l>r){
        return 0;
    }
	if(tree[x].l>=l&&tree[x].r<=r){
		return tree[x].val;
	}
	int mid=(tree[x].l+tree[x].r)>>1;
	int res=0;
	pushdown(x);
	res+=query(ls,l,mid)%mod,res%=mod;
	res+=query(rs,mid+1,r)%mod,res%=mod;
	return res;
}
int n,m;
signed main(){
    cin>>n>>m>>mod;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int op;
		int x,y,z;
		cin>>op;
		if(op==1){
			cin>>x>>y>>z;
			change1(1,x,y,z);
		}
		else if(op==2){
			cin>>x>>y>>z;
			change2(1,x,y,z);
		}
		else{
			cin>>x>>y;
			cout<<query(1,x,y)%mod<<"\n";
		}
	}
    return 0;
}

变量解释:

laj:加法懒标记

lac:乘法懒标记

改了两小时了求大佬帮忙看看吧 QAQ

2024/8/8 15:06
加载中...