ToT,犇犇帮我看看⑧,整了一晚上了。
查看原帖
ToT,犇犇帮我看看⑧,整了一晚上了。
403680
Torry_Q楼主2020/10/12 23:29

按自己的想法写的线段树...练想带调做了一晚上了,不知道WA哪里了,神犇帮我康康吧


#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 105;
#define ls(u) p[u].ch[0]
#define rs(u) p[u].ch[1]
int n,m,mod;
int num[N];
struct Node
{
    int l,r,len,ch[2];
    ll ans=0,tag1=0,tag2=1;
}p[4*N];

void push_up(int u)
{
    p[u].ans=(p[ls(u)].ans+p[rs(u)].ans)%mod;
}
void push_down(int u)
{
    p[ls(u)].tag2=(p[ls(u)].tag2*p[u].tag2)%mod;
    p[ls(u)].tag1=(p[ls(u)].tag1*p[u].tag2)%mod;
    p[ls(u)].ans=(p[ls(u)].ans*p[u].tag2)%mod;
    p[rs(u)].tag2=(p[rs(u)].tag2*p[u].tag2)%mod;
    p[rs(u)].tag1=(p[rs(u)].tag1*p[u].tag2)%mod;
    p[rs(u)].ans=(p[rs(u)].ans*p[u].tag2)%mod;
    p[u].tag2=1;
    p[ls(u)].tag1=(p[ls(u)].tag1+p[u].tag1)%mod;
    p[rs(u)].tag1=(p[rs(u)].tag1+p[u].tag1)%mod;
    p[ls(u)].ans=(p[ls(u)].ans+p[u].tag1)%mod;
    p[rs(u)].ans=(p[rs(u)].ans+p[u].tag1)%mod;
    p[u].tag1=0;
}
void update1(int u,int k)
{
    p[u].tag1=(p[u].tag1+k)%mod;
    p[u].ans=(p[u].ans+(p[u].len*k)%mod)%mod;
}
void update2(int u,int k)
{
    p[u].tag2=(p[u].tag2*k)%mod;
    p[u].ans=(p[u].ans*k)%mod;
}
void build_tree(int u,int l,int r)
{
    int mid=(l+r)>>1;
    ls(u)=u<<1;rs(u)=u<<1|1;
    p[u].l=l;
    p[u].r=r;
    p[u].len=r-l+1;
    if(l==r)
    {
        p[u].ans=num[l];
        return ;
    }
    build_tree(ls(u),l,mid);
    build_tree(rs(u),mid+1,r);
    push_up(u);
}
void add(int u,int l,int r,int k)
{
    push_down(u);
    int mid=(p[u].l+p[u].r)>>1;
    if(p[u].l==l&&p[u].r==r)
    {
        update1(u,k);
        return ;
    }
    if(l>mid) add(rs(u),l,r,k);
    else if(r<=mid) add(ls(u),l,r,k);
    else 
    {
        add(ls(u),l,mid,k);
        add(rs(u),mid+1,r,k);
    }
    push_up(u);
}
void mul(int u,int l,int r,int k)
{
    push_down(u);
    int mid=(p[u].l+p[u].r)>>1;
    if(p[u].l==l&&p[u].r==r) 
    {
        update2(u,k);
        return ;
    }
    if(l>mid) mul(rs(u),l,r,k);
    else if(r<=mid) mul(ls(u),l,r,k);
    else
    {
        mul(ls(u),l,mid,k);
        mul(rs(u),mid+1,r,k);
    }
    push_up(u);
}
ll find_sum(int u,int l,int r)
{
    int mid=(p[u].l+p[u].r)>>1;
    push_down(u);
    if(l==p[u].l&&r==p[u].r)
    {
        return p[u].ans;
    }
    if(l>mid) return find_sum(rs(u),mid+1,r)%mod;
    else if(r<=mid) return find_sum(ls(u),l,mid)%mod;
    else return (find_sum(ls(u),l,mid)+find_sum(rs(u),mid+1,r))%mod;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m>>mod;
    for(int i=1;i<=n;++i)
    {
        cin>>num[i];
    }
    build_tree(1,1,n);
    for(int i=1;i<=m;++i)
    {
        int mark,x,y,k;
        cin>>mark>>x>>y;
        if(mark==1) {cin>>k; mul(1,x,y,k);}
        if(mark==2) {cin>>k; add(1,x,y,k);}
        if(mark==3) {cout<<find_sum(1,x,y)<<"\n";}
    }
    return 0;
}
2020/10/12 23:29
加载中...