BZOJ 4597: [Shoi2016]随机序列 线段树 + 思维

本文介绍了一种使用段式树状数组结合快速幂优化的数据结构和算法实现,用于解决动态更新和查询问题。通过实例演示了如何在大规模数据集上高效地进行元素更新和区间查询操作,特别是在涉及大量更新和查询的情况下,该方法能够显著提高运行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Code: 

#include <bits/stdc++.h>
using namespace std;  
namespace IO {
    void setIO(string s) {
        string in=s+".in"; 
        freopen(in.c_str(),"r",stdin); 
    }
};   
typedef long long ll;      
const int maxn=100004;       
const ll mod=1000000007;    
int n,m;  
ll A[maxn],mul[maxn*4],Ans[maxn*4],qpow[maxn];     
void pushup(int x) {
    mul[x]=mul[x<<1]*mul[(x<<1)|1]%mod;  
    Ans[x]=(Ans[x<<1]+mul[x<<1]*Ans[(x<<1)|1]%mod)%mod;    
}
void build(int l,int r,int now) { 
    if(l==r) {
        mul[now]=A[l];  
        if(l==n) Ans[now]=A[l]; 
        else Ans[now]=A[l]*1ll*2*qpow[n-l-1]%mod;   
        return;   
    } 
    int mid=(l+r)>>1; 
    build(l,mid,now<<1); 
    build(mid+1,r,(now<<1)|1); 
    pushup(now); 
}
void update(int l,int r,int now,int p,int v) {
    if(l==r) {
        A[l]=1ll*v;      
        mul[now]=A[l];  
        if(l==n) Ans[now]=A[l];  
        else Ans[now]=A[l]*1ll*2*qpow[n-l-1]%mod; 
        return; 
    }
    int mid=(l+r)>>1;     
    if(p<=mid) update(l,mid,now<<1,p,v); 
    else update(mid+1,r,(now<<1)|1,p,v); 
    pushup(now);   
}
int main() { 
    using namespace IO; 
    // setIO("input");    
    scanf("%d%d",&n,&m); 
    for(int i=1;i<=n;++i) scanf("%lld",&A[i]);  
    qpow[0]=mul[0]=Ans[0]=1;   
    for(int i=1;i<=n+2;++i) qpow[i]=qpow[i-1]*3%mod;     
    build(1,n,1);  
    for(int cas=1;cas<=m;++cas) {
        int t,v; 
        scanf("%d%d",&t,&v);   
        update(1,n,1,t,v);     
        printf("%lld\n",Ans[1]%mod);       
    }
    return 0; 
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值