社区讨论

线段树求调

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@lo3agdsg
此快照首次捕获于
2023/10/24 03:26
2 年前
此快照最后确认于
2023/10/24 03:26
2 年前
查看原帖
除夕了
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long 
int n,m,p;
const int N=1e5+7;
int w[N];
struct node{
    int l,r;
    int add,mul,sum;
}t[N*4];

void maketag(int u,int len,int ad,int mu)
{
    t[u].sum=(t[u].sum*mu+len*ad)%p;
    t[u].mul=(t[u].mul+mu)%p;
    t[u].add=(t[u].add*mu+ad)%p;
}

void pushdown(int u)
{
    maketag(u*2,t[u*2].r-t[u*2].l+1,t[u].add,t[u].mul);
    maketag(u*2+1,t[u*2+1].r-t[u*2+1].l+1,t[u].add,t[u].mul);
    t[u].mul=1,t[u].add=0;
}

void pushup(int u)
{
    t[u].sum=(t[u*2].sum+t[u*2+1].sum)%p;
}

void build(int u,int l,int r)
{
    if(l==r)
    {
        t[u]={l,r,0,1,w[l]};
        return;
    }
    else
    {
        t[u]={l,r,0,1,0};
        int mid=(l+r)/2;
        build(u*2,l,mid);
        build(u*2+1,mid+1,r);
        pushup(u);
    }
}

void modify(int u,int l,int r,int ad,int mu)
{
    if(t[u].l>=l&&t[u].r<=r)
    {
        maketag(u,t[u].r-t[u].l+1,ad,mu);
    }
    else
    {
        pushdown(u);
        int mid=(t[u].l+t[u].r)/2;
        if(l<=mid)
            modify(u*2,l,r,ad,mu);
        if(r>mid)
            modify(u*2+1,l,r,ad,mu);
        pushup(u);
    }
}

int search(int u,int l,int r)
{
    if(t[u].l>=l&&t[u].r<=r)
        return t[u].sum;
    pushdown(u);
    int mid=(t[u].l+t[u].r)/2;
    int sum=0;
    if(l<=mid)
        sum=search(u*2,l,r);
    if(r>mid)
        sum=(sum+search(u*2+1,l,r))%p;
    return sum;
}

signed main()
{
    cin>>n>>m>>p;
    for(int i=1;i<=n;i++)
        cin>>w[i];
    build(1,1,n);
    while (m--)
    {
        int t;
        cin>>t;
        if(t==1)
        {
            int x,y,k;
            cin>>x>>y>>k;
            modify(1,x,y,0,k);
        }
        if(t==2)
        {
            int x,y,k;
            cin>>x>>y>>k;
            modify(1,x,y,k,1);
        }
        if(t==3)
        {
            int x,y;
            cin>>x>>y;
            cout<<search(1,x,y)<<endl;
        }
    }
    return 0;
}
``` __ 

回复

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

正在加载回复...