only AC on #1 树状数组求条(玄关
  • 板块P5142 区间方差
  • 楼主TC_QD
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/7/19 15:35
  • 上次更新2025/7/19 17:37:30
查看原帖
only AC on #1 树状数组求条(玄关
1335720
TC_QD楼主2025/7/19 15:35
#include <bits/stdc++.h>
#define int long long
#define lowbit(x) x&-x
using namespace std;
constexpr int mod=1e9+7;
int n,m,b[100005],c,x,y;
int tr[3][100005];//tr[1]维护区间和,tr[2]维护区间平方和
int qpow(int x,int n){//快速幂
	int res=1;
	while (n){
		if (n&1){
			res=(res*x)%mod;
		}
		n=n>>1;
		x=(x*x)%mod;
	}
	return res%mod;
}
void change(int i,int k){//单点修改
    int t=i;
    while (t<=n){
        tr[1][t]+=k;
        t+=lowbit(t);
    }
    t=i;
    while (t<=n){
        tr[2][t]+=(b[t]+k)*(b[t]+k)-b[t]*b[t];
        t+=lowbit(t);
    }
    return;
}
int query(int x,int op){//区间查询
    int res=0;
    while (x>0){
        res+=tr[op][x];
        x-=lowbit(x);
    }
    return res;
}
int inq(int x,int y,int op){
    return query(y,op)-query(x-1,op);
}
signed main(){
    cin>>n>>m;
    for (int i=1;i<=n;i++){
        cin>>b[i];
        change(i,b[i]);
    }
    while (m--){
        cin>>c>>x>>y;
        if (c==1){
            change(x,y-b[x]);
            b[x]=y;
        }else{
            int a=inq(x,y,2)*(y-x+1)%mod-inq(x,y,1)*inq(x,y,1)%mod;
            int b=(y-x+1)*(y-x+1)%mod;
            cout<<(a*qpow(b,mod-2)%mod+mod)%mod<<'\n';//求逆元 & ans
        }
    }
    return 0;
}

马蜂恶臭,还请见谅(qwq

2025/7/19 15:35
加载中...