谁帮我调线段树啊呜呜
  • 板块题目总版
  • 楼主Iwara_qwq
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/7/20 18:50
  • 上次更新2023/10/27 19:15:44
查看原帖
谁帮我调线段树啊呜呜
724676
Iwara_qwq楼主2022/7/20 18:50

RT

#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
using namespace std;
namespace Yorihime_Nao{
    template<class T> T MAX(T x,T y){
        return x>y?x:y;
    }
    template<class T,class ... Arg> T MAX(T x,T y,Arg ... arg){
        return MAX(x>y?x:y,arg...);
    }
    template<class T> T MIN(T x,T y){
        return x<y?x:y;
    }
    template<class T,class ... Arg> T MIN(T x,T y,Arg ... arg){
        return MIN(x<y?x:y,arg...);
    }
    template<class T> T lowbit(T x){
        return x&-x;
    }
}
using namespace Yorihime_Nao;
const ll MAXN=1e5+5;
ll n,p,q,arr[MAXN],op,l,r,x;
ll data[MAXN<<2],lazy_add[MAXN<<2],lazy_mul[MAXN<<2];
void build(ll id,ll L,ll R){
    if(L==R){
        data[id]=arr[L]%p;
        lazy_add[id]=0;
        lazy_mul[id]=1;
        return;
    }
    ll mid=L+R>>1;
    build(id<<1,L,mid);
    build((id<<1)+1,mid+1,R);
    data[id]=(data[id<<1]+data[(id<<1)+1])%p;
    return;
}
void push_down(ll id,ll L,ll R){
    ll mid=L+R>>1;
    data[id<<1]=(data[id<<1]*lazy_mul[id]%p+lazy_add[id]*(mid-L+1)%p)%p;
    lazy_add[id<<1]=(lazy_add[id<<1]*lazy_mul[id]%p+lazy_add[id])%p;
    lazy_mul[id<<1]=lazy_mul[id<<1]*lazy_mul[id]%p;
    data[(id<<1)+1]=(data[(id<<1)+1]*lazy_mul[id]%p+lazy_add[id]*(R-mid)%p)%p;
    lazy_add[(id<<1)+1]=(lazy_add[(id<<1)+1]*lazy_mul[id]%p+lazy_add[id])%p;
    lazy_mul[(id<<1)+1]=lazy_mul[(id<<1)+1]*lazy_mul[id]%p;
    lazy_add[id]=0;
    lazy_mul[id]=1;
    return;
}
void add(ll id,ll L,ll R,ll UL,ll UR,ll delta){
    if(L>UR||R<UL)return;
    if(UL<=L&&R<=UR){
        data[id]=(data[id]+(R-L+1)*delta%p)%p;
        lazy_add[id]=(lazy_add[id]+delta)%p;
        return;
    }
    push_down(id,L,R);
    ll mid=L+R>>1;
    add(id<<1,L,mid,UL,UR,delta);
    add((id<<1)+1,mid+1,R,UL,UR,delta);
    data[id]=(data[id<<1]+data[(id<<1)+1])%p;
    return;
}
void mul(ll id,ll L,ll R,ll UL,ll UR,ll delta){
    if(L>UR||R<UL)return;
    if(UL<=L&&R<=UR){
        data[id]=data[id]*delta%p;
        lazy_add[id]=lazy_mul[id]*delta%p;
        return;
    }
    push_down(id,L,R);
    ll mid=L+R>>1;
    mul(id<<1,L,mid,UL,UR,delta);
    mul((id<<1)+1,mid+1,R,UL,UR,delta);
    data[id]=(data[id<<1]+data[(id<<1)+1])%p;
    return;
}
ll query(ll id,ll L,ll R,ll QL,ll QR){
    if(L>QR||R<QL)return 0;
    if(QL<=L&&R<=QR)return data[id];
    push_down(id,L,R);
    ll mid=L+R>>1;
    return (query(id<<1,L,mid,QL,QR)+query((id<<1)+1,mid+1,R,QL,QR))%p;
}
int main(){
    scanf("%lld%lld",&n,&p);
    for(int i=1;i<=n;i++)scanf("%lld",&arr[i]);
    build(1,1,n);
    scanf("%lld",&q);
    for(int i=1;i<=q;i++){
        scanf("%lld%lld%lld",&op,&l,&r);
        if(op==1){
            scanf("%lld",&x);
            mul(1,1,n,l,r,x);
        }
        if(op==2){
            scanf("%lld",&x);
            add(1,1,n,l,r,x);
        }
        if(op==3)printf("%lld\n",query(1,1,n,l,r));
    }
    return 0;
}

线段树2
写挂了

2022/7/20 18:50
加载中...