单点加区间方差板子30pts求助
查看原帖
单点加区间方差板子30pts求助
906856
A2_Zenith楼主2023/9/10 21:01

记录

样例已过,能取模的都取了,不到哪里出了锅

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<cstdlib>
#include<iomanip>
#include<map>
#define int long long
#define db long double
#define pii pair<int,int>
#define up(i,l,r) for(int i=(l);i<=(r);i++)
#define down(i,l,r) for(int i=(l);i>=(r);--i)
#define p_b push_back
#define m_p make_pair
using namespace std;
int mod=1e9+7;
int b[100007];
int sum[100007];
int s[100007];
int sqs[100007];
int sqsum[100007];
int n,m;
int qpow(int a,int b){
    if(b==1)return a;
    int ans=1;
    if(b&1){
        int u=qpow(a,b/2);
        ans=ans*u%mod;
        ans=ans*u%mod;
        ans=ans*a%mod;
        return ans;
    }
    else{
        int u=qpow(a,b/2);
        ans=ans*u%mod;
        ans=ans*u%mod;
        return ans;
    }
}
int inv(int a){
    return qpow(a,mod-2);
}
int lowbit(int x){
    return x&-x;
}
int getsum(int r){
    int ans=0;
    while(r>0){
        ans+=s[r];
        ans%=mod;
        r-=lowbit(r);
    }
    return ans;
}
int getsqs(int r){
    int ans=0;
    while(r>0){
        ans+=sqs[r];
        ans%=mod;
        r-=lowbit(r);
    }
    return ans;
}
int qsum(int l,int r){
    return ((getsum(r)%mod-getsum(l-1)%mod)%mod+mod)%mod;
}
int qsqs(int l,int r){
    return ((getsqs(r)%mod-getsqs(l-1)%mod)%mod+mod)%mod;
}
int var(int l,int r){
    int sm=qsum(l,r);
    int sqs=qsqs(l,r);
    int len=r-l+1;
//    cout<<sm<<" "<<sqs<<" "<<len<<endl;
    int fz=((sqs%mod*len%mod-sm%mod*sm%mod)%mod+mod)%mod;
    int fm=len%mod*len%mod;
//    cout<<fz<<" "<<fm<<endl;
    return inv(fm)%mod*fz%mod;
}
void upd(int x,int y){
    int u=b[x];
    while(x<=n){
        s[x]+=(y-u)%mod;
        sqs[x]+=((y-u)%mod*((y+u)%mod)%mod);
        sqs[x]%=mod;
        s[x]%=mod;
        x+=lowbit(x);
    }
}

signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>b[i];
        sum[i]=(sum[i-1]+b[i])%mod;
        sqsum[i]=(sqsum[i-1]+b[i]%mod*b[i]%mod)%mod;
    }
    for(int i=1;i<=n;i++){
        s[i]=((sum[i]%mod-sum[i-lowbit(i)]%mod)%mod+mod)%mod;
        sqs[i]=((sqsum[i]%mod-sqsum[i-lowbit(i)]%mod)%mod+mod)%mod;
    }
    for(int i=1;i<=m;i++){
        int op;
        cin>>op;
        if(op==1){
            int x,y;
            cin>>x>>y;
            upd(x,y);
        }
        else{
            int l,r;
            cin>>l>>r;
            cout<<var(l,r)<<endl;
        }
    }
}

2023/9/10 21:01
加载中...