刚学,自己瞎胡的代码,还差一点点找不到问题
查看原帖
刚学,自己瞎胡的代码,还差一点点找不到问题
141331
chenbinggang楼主2021/6/20 21:48
#include<iostream>
#include<cstdio>
#define lson l,mid,k<<1
#define rson mid+1,r,k<<1|1
long long tree[500000],lazy[1000000],lazyC[1000000],n,m,Mod;
using namespace std;
void Push(long long k)
{
	tree[k]=tree[k<<1]+tree[k<<1|1];
	return;
}
void build(long long l,long long r,long long k)
{
//	lazyC[k]=1;
	if(l==r)
	{
		scanf("%lld",&tree[k]);
		return;
	}
	long long mid=l+r>>1;
	build(lson);
	build(rson);
	Push(k); 
}
void pushdown(long long ln,long long rn,long long k)
{
//	cout<<k<<" "<<lazyC[k]<<" "<<lazy[k]<<endl;
	if(lazyC[k])
	{
//	cout<<lazyC[k]<<" "<<k<<endl;
	tree[k<<1]+=ln*lazy[k]%Mod;//计算对两个子节点的影响 
	tree[k<<1|1]+=rn*lazy[k]%Mod;
	tree[k<<1]*=lazyC[k]%Mod;
	tree[k<<1|1]*=lazyC[k]%Mod;
//	tree[k<<1]*=lazyC[k];
//	tree[k<<1|1]*=lazyC[k];
//	tree[k<<1]+=ln*lazy[k]*lazyC[k]%Mod;
//	tree[k<<1|1]+=rn*lazy[k]*lazyC[k]%Mod;
	lazy[k<<1]=(lazy[k<<1]*lazyC[k]+lazy[k]*ln*lazyC[k])%Mod;
	lazy[k<<1|1]=(lazy[k<<1|1]*lazyC[k]+lazy[k]*rn*lazyC[k])%Mod;
	if(lazyC[k<<1|1])lazyC[k<<1|1]*=lazyC[k]%Mod;
	else lazyC[k<<1|1]+=lazyC[k]%Mod;
	if(lazyC[k<<1])lazyC[k<<1]*=lazyC[k]%Mod;//把加法和乘法标记下放 
	else lazyC[k<<1]+=lazyC[k]%Mod;
	lazyC[k]=0;
	lazy[k]=0;
}
else
{
	tree[k<<1]+=ln*lazy[k]%Mod;//计算对两个子节点的影响 
	tree[k<<1|1]+=rn*lazy[k]%Mod;
	lazy[k<<1]+=lazy[k]%Mod;
	lazy[k<<1|1]+=lazy[k]%Mod;
	lazy[k]=0;
}
	return;
}
void updateC(long long L,long long R,long long C,long long l,long long r,long long k)
{
	if(l>=L&&r<=R)
	{
	//	cout<<l<<" "<<r<<endl;
		tree[k]=tree[k]*C%Mod;
	//	lazyC[k]+=C%Mod;
		if(lazyC[k])lazyC[k]*=C%Mod;
		else lazyC[k]+=C;
		return;
	}
	long long mid=l+r>>1;
	pushdown(mid-l+1,r-mid,k);
	if(L<=mid)updateC(L,R,C,lson);
	if(R>mid)updateC(L,R,C,rson);
	Push(k);
}
void update(long long L,long long R,long long C,long long l,long long r,long long k)
{
	if(l>=L&&r<=R)//如果修改范围只在L,R之间的话 
	{
		tree[k]+=C*(r-l+1);
		lazy[k]+=C;
	return;
}
	long long mid=l+r>>1;
	pushdown(mid-l+1,r-mid,k);
	if(L<=mid)update(L,R,C,lson);
	 if(R>mid)update(L,R,C,rson);
	Push(k);
}
long long query(long long L,long long R,long long l,long long r,long long k)
{
	if(l>=L&&r<=R)return tree[k];
	long long mid=l+r>>1;
	pushdown(mid-l+1,r-mid,k);
	long long res=0;
	if(L<=mid)res+=query(L,R,lson)%Mod;
	 if(R>mid)res+=query(L,R,rson)%Mod;
	 return res%Mod;
}
int main()
{
	scanf("%lld%lld%lld",&n,&m,&Mod);
	build(1,n,1);
	long long t,x,y,z;
	for(long long i=1;i<=m;i++)
	{
		scanf("%lld",&t);
        if(t==1)
        {
            //cout<<100;
            scanf("%lld%lld%lld",&x,&y,&z);
            updateC(x,y,z,1,n,1);
        }
        if(t==3)
        {
            scanf("%lld%lld",&x,&y);
        //  res=0;
            cout<<query(x,y,1,n,1)<<endl;
        }
        if(t==2)
        {
            //cout<<100;
            scanf("%lld%lld%lld",&x,&y,&z);
            update(x,y,z,1,n,1);
        }
        if(t==4)
        {
        	int e;
        	scanf("%lld",&e);
        	cout<<lazy[e]<<" "<<lazyC[e]<<endl;
		}
	}
}

找不到错误

2021/6/20 21:48
加载中...