求助大佬代码问题
查看原帖
求助大佬代码问题
363491
U_92_Uranium楼主2022/9/2 15:30

R.T.

这是问题代码,但是我没有调试出来,请求你的帮助!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <deque>
#include <cctype>
#include <cstdlib>
#include <iomanip>
using namespace std;
const int maxn=1e5;
using ll=long long;
ll st[4*maxn+10],lz[4*maxn+10],lz2[4*maxn+10];/*lz[i]是乘法标记,lz2是加法标记*/
ll m,n,p,a[maxn+10];
ll  lRd()
{
	ll res=0,f=1;
	char c=getchar();

	while(!isdigit(c)) {
		if(c=='-') {
			f=-1;
		}
		c=getchar();
	}
	while(isdigit(c)) {
		res=(res<<1)+(res<<3)+c-'0';
		c=getchar();
	}
	return res*f;
}
void PushUp(int k)
{
	st[k]=(st[k<<1]+st[k<<1|1])%p;
}
void Chge(int l,int r,int k,int v,int op)
{
	/*乘法*/
	if(op==1) {
		lz[k]=(lz[k]*v%p)%p;
		st[k]=(st[k]*v%p)%p;
	} else {//+加法
		if(op==2) {
			lz2[k]=(lz2[k]+v%p)%p;
			/**/
			st[k]=(st[k]+(v%p*(r-l+1)%p)%p)%p;
		}
	}

}
void PushDown(int l,int r,int k)
{
	if(lz[k]>1) {
		Chge(l,r,k<<1,lz[k],1) ;
		Chge(l,r,k<<1|1,lz[k],1);
		lz[k]=1;
	}
	if(lz2[k]) {
		/**/
		Chge(l,r,k<<1,lz2[k],2);
		Chge(l,r,k<<1|1,lz2[k],2);
		lz2[k]=0;
	}
}
void Bd(int l,int r,int k)
{
	if(l==r) {
		st[k]=a[l];
		return;
	}
	int mid=l+(r-l>>1);
	Bd(l,mid,k<<1);
	Bd(mid+1,r,k<<1|1);
	PushUp(k);
}
void Upd(int l,int r,int k,int x,int y,int v,int op,int step)
{
	if(l>=x&&r<=y) {
		Chge(l,r,k,v,op);
		return;
	}

	PushDown(l,r,k);

	int mid=l+(r-l>>1);
	if(x<=mid) {
		Upd(l,mid,k<<1,x,y,v,op,1+step);
	}
	if(y>mid) {
		Upd(mid+1,r,k<<1|1,x,y,v,op,step+1);
	}
	PushUp(k);
}
ll Fd(int l,int r,int k,int x,int y,int step)
{
	if(l>=x&&r<=y) {
		return st[k];
	}

	PushDown(l,r,k);
	
	ll res=0,res2=0;
	int mid=l+(r-l>>1);
	if(x<=mid) {
		
		res=(res+Fd(l,mid,k<<1,x,y,step+1)%p)%p;printf("结点%d的左子树返回%lld\n",k,res);
	}
	if(y>mid) {
		res2=(Fd(mid+1,r,k<<1|1,x,y,step+1)%p)%p;printf("结点%d的右子树返回%lld\n",k,res2);
	}
	return (res+res2)%p;
}

int main()
{
	scanf("%lld%lld%lld",&n,&m,&p);
	for(int i=1; i<=n; ++i) {
		a[i]=lRd();
	}
	Bd(1,n,1);
	/*初始化lz[i]=1*/
	for(int i=1; i<=4*n; ++i) {
		lz[i]=1;
	}
	for(int i=1; i<=m; ++i) {
		int op,x,y,v;
		op=lRd(),x=lRd(),y=lRd();
		if(op!=3) {
			v=lRd();
			Upd(1,n,1,x,y,v,op,1);

		} else {
			printf("%lld\n",Fd(1,n,1,x,y,1));
		}
	}
	return 0;
}
2022/9/2 15:30
加载中...