全WA,求调!!!
查看原帖
全WA,求调!!!
389513
_Rahab_楼主2023/11/26 15:29
#include <bits/stdc++.h>
using namespace std;
#define ll long long

inline ll read()
{
    ll x=0,f=1;
    char c=getchar();
    while(c<'0' || c>'9')
    {
        if(c=='-')
            f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}//快读

const int NUM=1e5+5;
ll tree[NUM<<2],a[NUM<<2];
ll n,q,m,step_tree;
ll lazy_sum[NUM<<2],lazy_mu[NUM<<2];

inline ll left_son(ll x)
{
    return x<<1;
}//求左儿子

inline ll right_son(ll x)
{
    return (x<<1)|1;
}//求右儿子

inline ll sum_up(ll x)
{
    return tree[x]=tree[left_son(x)]+tree[right_son(x)];
}//求和

inline void build_tree(ll l,ll r,ll x)
{
    lazy_mu[x]=1;
    lazy_sum[x]=0;
    if(l == r)
    {
        tree[x] = a[l]%m;
        return;
    }
    ll mid=(l+r)>>1;
    build_tree(l,mid,left_son(x));
    build_tree(mid+1,r,right_son(x));
    sum_up(x);
}//构建线段树

inline void maketag(ll now_site,ll l,ll r,ll ad,ll mu)
{
    tree[now_site] = tree[now_site]*mu%m;
    tree[now_site] = (tree[now_site]+(r-l+1)*ad)%m;
    lazy_mu[now_site] = (lazy_mu[now_site]+mu)%m;
    lazy_sum[now_site] = lazy_sum[now_site]*mu%m;
    lazy_sum[now_site] = (lazy_sum[now_site]+ad)%m;
    return;
}

inline void pushdown(ll now_site,ll l,ll r)
{
    ll mid=(l+r)>>1;
    maketag(left_son(now_site),l,mid,lazy_sum[now_site],lazy_mu[now_site]);
    maketag(right_son(now_site),mid+1,r,lazy_sum[now_site],lazy_mu[now_site]);
    lazy_mu[now_site] = 1;
    lazy_sum[now_site] = 0;
    return;
}

inline void update(ll need_l,ll need_r,ll l,ll r,ll now_site,ll ad,ll mu)
{
    if(need_l <= l && need_r >= r)
    {
        tree[now_site]=(tree[now_site]*mu)%m;
        tree[now_site] = (tree[now_site]+ad*(r-l+1))%m;
        lazy_mu[now_site] = (lazy_mu[now_site]+mu)%m;
        lazy_sum[now_site] = lazy_sum[now_site]*mu%m;
        lazy_sum[now_site] = (lazy_sum[now_site]+ad)%m;
        return;
    }
    pushdown(now_site,l,r);
    ll mid=(l+r)>>1;
    if(need_l <= mid)
        update(left_son(now_site),need_l,need_r,l,mid,ad,mu);
    if(mid < need_r)
        update(right_son(now_site),need_l,need_r,mid+1,r,ad,mu);
    sum_up(now_site);
}

inline ll get_ans(ll l,ll r,ll need_l,ll need_r,ll now_site)
{
    if(need_l <= l && need_r >= r)
        return tree[now_site];
    ll mid=(l+r)>>1;
    pushdown(now_site,l,r);
    ll num=0;
    if(need_l <= mid)
        num+=get_ans(l,mid,need_l,need_r,left_son(now_site))%m;
    if(need_r > mid)
        num+=get_ans(mid+1,r,need_l,need_r,right_son(now_site))%m;
    return num%m;
}

int main() 
{
    n = read();
    q = read();
    m = read();
    for(int i=1;i <= n;++i)
        a[i] = read();
    build_tree(1,n,1);
    while(q--)
    {
        step_tree = read();
        if(step_tree == 1)
        {
            int x,y,z;
            x = read();
            y = read();
            z = read();
            update(x,y,1,n,1,0,z);
        }
        else{
            if(step_tree == 2)
            {
                int x,y,z;
                x = read();
                y = read();
                z = read();
                update(x,y,1,n,1,z,1);
            }
            else{
                int x,y;
                x = read();
                y = read();
                printf("%lld\n",get_ans(1,n,x,y,1));
            }
        }
    }
    return 0;
}

蒻蒟蒟一枚,样例都没过,但是不知道哪里错了

2023/11/26 15:29
加载中...