社区讨论

成功疯掉了。。。

P3373【模板】线段树 2参与者 4已保存回复 12

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
12 条
当前快照
1 份
快照标识符
@mi7pqbiy
此快照首次捕获于
2025/11/21 01:36
4 个月前
此快照最后确认于
2025/11/21 01:53
4 个月前
查看原帖
大佬看看哪里错了。。。
CPP
#include<bits/stdc++.h>
using namespace std;
const long long MAXN=1000001;
long long n,m,x,y,c,opt,ans,p;
struct TREE
{
    long long l;
    long long r;
    long long w;
    long long jia;
    long long cheng;
}tree[MAXN*4];
void down(long long k)
{
    tree[k*2].jia=(tree[k*2].jia*tree[k].cheng+tree[k].jia)%p;
    tree[k*2+1].jia=(tree[k*2+1].jia*tree[k].cheng+tree[k].jia)%p;
    tree[k*2].cheng=(tree[k*2].cheng*tree[k].cheng)%p;
    tree[k*2+1].cheng=(tree[k*2+1].cheng*tree[k].cheng)%p;
    tree[k*2].w=(tree[k*2].w*tree[k].cheng+tree[k].jia*(tree[k].r-tree[k].l+1))%p;
    tree[k*2+1].w=(tree[k*2+1].w*tree[k].cheng+tree[k].jia*(tree[k].r-tree[k].l+1))%p;
    tree[k].jia=0;
    tree[k].cheng=1;
}
void build(long long l,long long r,long long k)
{
    tree[k].l=l;tree[k].r=r;
    tree[k].cheng=1;
    if(l==r)
    {
        cin>>tree[k].w;
        return;
    }
    long long mid=(l+r)/2;
    build(l,mid,k*2);
    build(mid+1,r,k*2+1);
    tree[k].w=tree[k*2].w+tree[k*2+1].w;
}
void manychan(long long x,long long y,long long w,long long k)
{
    if(tree[k].l>=x&&tree[k].r<=y)
    {
        tree[k].w=(tree[k].w+(tree[k].r-tree[k].l+1)*w)%p;
        tree[k].jia=(tree[k].jia+w)%p;
        return;
    }
    if(tree[k].jia) down(k);
    long long mid=(tree[k].l+tree[k].r)/2;
    if(x<=mid) manychan(x,y,w,k*2);
    if(y>mid) manychan(x,y,w,k*2+1);
    tree[k].w=(tree[k*2].w+tree[k*2+1].w)%p;
}
void manycheng(int x,int y,int a,int k)
{
    if(tree[k].l>=x&&tree[k].r<=y)
    {
        tree[k].w=(tree[k].w*a)%p;
        tree[k].jia=(tree[k].jia*a)%p;
        tree[k].cheng=(tree[k].cheng*a)%p;
        return;
    }
    if(tree[k].jia||tree[k].cheng) down(k);
    long long mid=(tree[k].l+tree[k].r)/2;
    if(x<=mid) manycheng(x,y,a,k*2);
    if(y>mid) manycheng(x,y,a,k*2+1);
    tree[k].w=(tree[k*2].w+tree[k*2+1].w)%p;
}
void sum(long long x,long long y,long long k)
{
    if(tree[k].l>=x&&tree[k].r<=y)
    {
        ans=(ans+tree[k].w)%p;
        return;
    }
    if(tree[k].jia) down(k);
    long long mid=(tree[k].l+tree[k].r)/2;
    if(x<=mid) sum(x,y,k*2);
    if(y>mid) sum(x,y,k*2+1);
}
int main()
{
    cin>>n>>m>>p;
    build(1,n,1);
    for(long long i=1;i<=m;i++)
    {
        cin>>opt;
        if(opt==1)
        {
            cin>>x>>y>>c;
            manycheng(x,y,c,1);
        }
        if(opt==2)
        {
            cin>>x>>y>>c;
            manychan(x,y,c,1);
        }
        if(opt==3)
        {
            cin>>x>>y;
            ans=0;
            sum(x,y,1);
            cout<<ans<<endl;
        }
    }
    return 0;
}

回复

12 条回复,欢迎继续交流。

正在加载回复...