过了,但是有疑问,玄关
查看原帖
过了,但是有疑问,玄关
1408054
zhaolt2012楼主2025/7/27 20:42

::::info[它俩看起来都一样,为什么前者对后者错] :::info[WA代码]

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
long long n,m,q,d[MAXN*4],b[MAXN*4],a[MAXN],c[MAXN*4];
void build(long long s,long long t,long long p)
{
	if(s==t)
	{
		d[p]=a[s]%m;
		return ;
	}
	long long mid=s+((t-s)>>1);
	build(s,mid,p*2);
	build(mid+1,t,p*2+1);
	d[p]=(d[p*2]+d[p*2+1])%m;
}
void g(long long mid,long long p,long long s,long long t)
{
	if(c[p]!=1)//&&s!=t
	{
		d[p*2]=(d[p*2]*c[p])%m;//先乘 
		d[p*2+1]=(d[p*2+1]*c[p])%m;
		
		c[p*2]=(c[p*2]*c[p])%m;
		c[p*2+1]=(c[p*2+1]*c[p])%m;
		
		b[p*2]=(b[p*2]*c[p])%m;
		b[p*2+1]=(b[p*2+1]*c[p])%m;
		
		c[p]=1;
	}
	if(b[p])//&&s!=t
	{
		d[p*2]=(d[p*2]+(mid-s+1)*b[p])%m;//乘一次 余一次 %m
		d[p*2+1]=(d[p*2+1]+(t-mid)*b[p])%m;//%m
		
		b[p*2]=(b[p*2]+b[p])%m;
		b[p*2+1]=(b[p*2+1]+b[p])%m;
		
		b[p]=0;
	}	
}
void update(long long l,long long r,long long s,long long t,long long p,long long k)
{
	if(l<=s&&t<=r)
	{
		d[p]=(d[p]*k)%m;
		c[p]=(c[p]*k)%m;
		b[p]=(c[p]*k)%m;
		return ;
	}
	long long mid=s+((t-s)>>1);
	g(mid,p,s,t);
	if(l<=mid) update(l,r,s,mid,p*2,k);
	if(r>mid) update(l,r,mid+1,t,p*2+1,k);//=+1
	d[p]=(d[p*2]+d[p*2+1])%m;
}
void update2(long long l,long long r,long long s,long long t,long long p,long long k)
{
	if(l<=s&&t<=r)
	{
		d[p]=(d[p]+k*(t-s+1))%m;
		b[p]=(b[p]+k)%m;
		return ;
	}
	long long mid=s+((t-s)>>1);
	g(mid,p,s,t);
	if(l<=mid) update2(l,r,s,mid,p*2,k);
	if(r>mid) update2(l,r,mid+1,t,p*2+1,k);//=+1
	d[p]=(d[p*2]+d[p*2+1])%m;
}
long long getsum(long long l,long long r,long long s,long long t,long long p)
{
	if(l<=s&&t<=r) return d[p];
	long long mid=s+((t-s)>>1),sum=0;
	g(mid,p,s,t);
	if(l<=mid) sum=(sum+getsum(l,r,s,mid,p*2))%m;
	if(r>mid) sum=(sum+getsum(l,r,mid+1,t,p*2+1))%m;//=+1
	return sum;
}
int main()
{
	cin>>n>>q>>m;
	for(int i=1;i<=n*4+10;i++) c[i]=1;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,n,1);
	for(int i=1;i<=q;i++)
	{
		int z,x,y,k;
		cin>>z>>x>>y;
		if(z==1)
		{
			cin>>k;
			update(x,y,1,n,1,k);
		}
		else if(z==2)
		{
			cin>>k;
			update2(x,y,1,n,1,k);
 		}
		else cout<<getsum(x,y,1,n,1)<<"\n";
	}
	return 0;
}

::: :::info[AC代码]

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
long long n,m,q,d[MAXN*4],b[MAXN*4],a[MAXN],c[MAXN*4];

void build(long long s,long long t,long long p) {
    if(s==t) {
        d[p]=a[s]%m;
        return;
    }
    long long mid=s+((t-s)>>1);
    build(s,mid,p*2);
    build(mid+1,t,p*2+1);
    d[p]=(d[p*2]+d[p*2+1])%m;
}

void push_down(long long p,long long s,long long t) {
    long long mid=(s+t)>>1;
    if(c[p]!=1) {
        d[p*2]=(d[p*2]*c[p])%m;
        d[p*2+1]=(d[p*2+1]*c[p])%m;
        
        c[p*2]=(c[p*2]*c[p])%m;
        c[p*2+1]=(c[p*2+1]*c[p])%m;
        
        b[p*2]=(b[p*2]*c[p])%m;
        b[p*2+1]=(b[p*2+1]*c[p])%m;
        
        c[p]=1;
    }
    if(b[p]) {
        d[p*2]=(d[p*2]+(mid-s+1)*b[p])%m;
        d[p*2+1]=(d[p*2+1]+(t-mid)*b[p])%m;
        
        b[p*2]=(b[p*2]+b[p])%m;
        b[p*2+1]=(b[p*2+1]+b[p])%m;
        
        b[p]=0;
    }
}

void update_mul(long long l,long long r,long long s,long long t,long long p,long long k) {
    if(l<=s&&t<=r) {
        d[p]=(d[p]*k)%m;
        c[p]=(c[p]*k)%m;
        b[p]=(b[p]*k)%m;
        return;
    }
    push_down(p,s,t);
    long long mid=s+((t-s)>>1);
    if(l<=mid) update_mul(l,r,s,mid,p*2,k);
    if(r>mid) update_mul(l,r,mid+1,t,p*2+1,k);
    d[p]=(d[p*2]+d[p*2+1])%m;
}

void update_add(long long l,long long r,long long s,long long t,long long p,long long k) {
    if(l<=s&&t<=r) {
        d[p]=(d[p]+k*(t-s+1))%m;
        b[p]=(b[p]+k)%m;
        return;
    }
    push_down(p,s,t);
    long long mid=s+((t-s)>>1);
    if(l<=mid) update_add(l,r,s,mid,p*2,k);
    if(r>mid) update_add(l,r,mid+1,t,p*2+1,k);
    d[p]=(d[p*2]+d[p*2+1])%m;
}

long long query(long long l,long long r,long long s,long long t,long long p) {
    if(l<=s&&t<=r) return d[p];
    push_down(p,s,t);
    long long mid=s+((t-s)>>1),sum=0;
    if(l<=mid) sum=(sum+query(l,r,s,mid,p*2))%m;
    if(r>mid) sum=(sum+query(l,r,mid+1,t,p*2+1))%m;
    return sum;
}

int main() {
    cin>>n>>q>>m;
    for(int i=1;i<=n*4;i++) c[i]=1;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,n,1);
    while(q--) {
        int op,x,y,k;
        cin>>op>>x>>y;
        if(op==1) {
            cin>>k;
            update_mul(x,y,1,n,1,k);
        } else if(op==2) {
            cin>>k;
            update_add(x,y,1,n,1,k);
        } else {
            cout<<query(x,y,1,n,1)<<"\n";
        }
    }
    return 0;
}

::: 有帮助必关 ::::

2025/7/27 20:42
加载中...