HDU4578 求调
  • 板块学术版
  • 楼主xzy039
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/30 15:01
  • 上次更新2024/8/30 18:53:39
查看原帖
HDU4578 求调
1348658
xzy039楼主2024/8/30 15:01
#include<bits/stdc++.h>//vjudge 代调
using namespace std;

#define int long long 
#define ls now<<1
#define rs now<<1|1

const int mod=10007;
int n,m,ope,l,r,x;
const int maxn=1e5+7;
int num[maxn];

struct Node{
    
    int l,r;
    
    int len;
    
    int sum[4],lazy[4];//lazy[0]->clr,[1]->mul,[2]->add
    
}node[maxn<<2];

void build(int l,int r,int now){
    
    node[now].l=l,node[now].r=r;
    
    for(int i=0;i<3;i++)node[now].sum[i]=0,node[now].lazy[i]=0;
    
    node[now].lazy[1]=1;
    
    node[now].len=r-l+1;
    
    if(l!=r){
        
        int mid=l+r>>1;
        
        build(l,mid,ls);
        
        build(mid+1,r,rs);
        
    }
}

void pup(int now){
    
    for(int i=0;i<3;i++)node[now].sum[i]=(node[ls].sum[i]+node[rs].sum[i])%mod;
    
}

void pud(int now){
    
    if(node[now].lazy[0]){
        
        node[ls].lazy[0]=node[now].lazy[0];
        node[rs].lazy[0]=node[now].lazy[0];
        
        node[ls].lazy[1]=1;
        node[rs].lazy[1]=1;
        
        node[ls].lazy[2]=0;
        node[rs].lazy[2]=0;
        
        for(int i=0;i<3;i++){
            node[ls].sum[i]=(int)pow(node[now].lazy[0],i+1)*node[ls].len%mod;
            node[rs].sum[i]=(int)pow(node[now].lazy[0],i+1)*node[rs].len%mod;
        }
        
        node[now].lazy[0]=0;
        
    }
    
    if(node[now].lazy[1]!=1){
        
        node[ls].lazy[1]=node[ls].lazy[1]*node[now].lazy[1]%mod;
        node[rs].lazy[1]=node[rs].lazy[1]*node[now].lazy[1]%mod;
        
        node[ls].lazy[2]=node[ls].lazy[2]*node[now].lazy[1]%mod;
        node[rs].lazy[2]=node[rs].lazy[2]*node[now].lazy[1]%mod;
        
        for(int i=0;i<3;i++){
            node[ls].sum[i]=(int)pow(node[now].lazy[1],i+1)*node[ls].len%mod;
            node[rs].sum[i]=(int)pow(node[now].lazy[1],i+1)*node[rs].len%mod;
        }
        
        node[now].lazy[1]=1;
        
    }
    
    if(node[now].lazy[2]){
        
        node[ls].lazy[2]=(node[ls].lazy[2]+node[now].lazy[2])%mod;
        
        node[ls].sum[2]=(node[ls].sum[2]+3*node[now].lazy[2]*node[ls].sum[1]+3*node[now].lazy[2]*node[now].lazy[2]*node[ls].sum[0]+node[ls].len*node[now].lazy[2]*node[now].lazy[2]*node[now].lazy[2])%mod;
        
        node[ls].sum[1]=(node[ls].sum[1]+2*node[now].lazy[2]*node[ls].sum[0]+node[ls].len*node[now].lazy[2]*node[now].lazy[2]*node[now].lazy[2])%mod;
        
        node[ls].sum[0]=(node[ls].sum[0]+node[ls].len*node[now].lazy[2])%mod;
        
        node[rs].lazy[2]=(node[rs].lazy[2]+node[now].lazy[2])%mod;
        
        node[rs].sum[2]=(node[rs].sum[2]+3*node[now].lazy[2]*node[rs].sum[1]+3*node[now].lazy[2]*node[now].lazy[2]*node[rs].sum[0]+node[rs].len*node[now].lazy[2]*node[now].lazy[2]*node[now].lazy[2])%mod;
        
        node[rs].sum[1]=(node[rs].sum[1]+2*node[now].lazy[2]*node[rs].sum[0]+node[rs].len*node[now].lazy[2]*node[now].lazy[2]*node[now].lazy[2])%mod;
        
        node[rs].sum[0]=(node[rs].sum[0]+node[rs].len*node[now].lazy[2])%mod;
        
        node[now].lazy[2]=0;
    }
}

int query(int now,int l,int r,int ope){
    
    if(node[now].l>=l&&node[now].r<=r){
        
        for(int i=0;i<3;i++) if(ope==i+1) return node[now].sum[i];
        
        pud(now);
        
        int mid=node[now].l+node[now].r>>1;
        
        int r=0;
        
        if(l<=mid)r=query(ls,l,r,ope);
        
        if(r>mid)r=(r+query(rs,l,r,ope))%mod;
        
        return r;
        
    }
    
}

void change(int now,int l,int r,int ope,int x){
    
    if(node[now].l>=l&&node[now].r<=r){
        
        if(ope==1) {
            
            node[now].lazy[2]=(node[now].lazy[2]+x)%mod;
        
            node[now].sum[2]=(node[now].sum[2]+3*x*node[now].sum[1]+3*x*x*node[now].sum[0]+node[now].len*x*x*x)%mod;
        
            node[now].sum[1]=(node[now].sum[1]+2*x*node[now].sum[0]+node[now].len*x*x*x)%mod;
        
            node[now].sum[0]=(node[now].sum[0]+node[now].len*x)%mod;
        }
        
        else if(ope==2){
            
            node[now].lazy[1]=node[now].lazy[1]*x%mod;
            
            node[now].lazy[2]=node[now].lazy[2]*x%mod;
            
            for(int i=0;i<3;i++){
                node[now].sum[i]=(int)pow(x,i+1)*node[now].len%mod;
            }
        }
        
        else {
            node[now].lazy[0]=x;
        
            node[now].lazy[1]=1;
        
            node[now].lazy[2]=0;
        
            for(int i=0;i<3;i++){
                node[now].sum[i]=(int)pow(x,i+1)*node[now].len%mod;
            }
            return ;
            
        }
        
        pud(now);
        
        int mid=node[now].l+node[now].r>>1;
        
        if(l<=mid) change(ls,l,r,ope,x);
        
        if(r>mid) change(rs,l,r,ope,x);
        
        pup(now);
        
    }
    
}

signed main(){
    
    std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    while(cin>>n>>m,n,m){
        
        build(1,n,1);
        
        while(m--){
            
            cin>>ope>>l>>r>>x;
            
            if(ope<4) change(1,l,r,ope,x);
            
            else cout<<query(1,l,r,ope)<<"\n";
            
        }
        
    }
    
}
2024/8/30 15:01
加载中...