首页 > 其他分享 >区间方差

区间方差

时间:2023-10-13 14:00:13浏览次数:38  
标签:方差 int inv ans 区间 query mod

P5142 区间方差

单点修改,区间查询。

更新很简单,直接赋值,然后更新(注意 \(y^2\) 可能爆 int)。

对于询问,我们考虑完全平方公式 \((a_i-a)^2=a_i^2-2aa_i+a^2\),我们发现只需要维护区间平方和,区间和,平均数可以由区间和+逆元求出,然后就可以求了。

注意可能爆 int 的地方。

#include<cstdio>
#include<iostream>
using namespace std;
#define ls p<<1
#define rs p<<1|1
const int N=100010,M=4*N,mod=1e9+7;
int l[M],r[M],b[N],n,m,inv[N],ps[M],s[M];
typedef long long ll;
#define add(a,b) (a+=b)>=mod&&(a-=mod)
#define sub(a,b) (a-=b)<0&&(a+=mod)
#define up s[p]=s[ls],add(s[p],s[rs]),ps[p]=ps[ls],add(ps[p],ps[rs])
struct he{
    int ps,s;
    void operator+=(he A){
        add(ps,A.ps);
        add(s,A.s);
    }
    he(int _a=0,int _b=0):ps(_a),s(_b){}
};
void build(int p,int L,int R){
    l[p]=L,r[p]=R;
    if(L==R){
        s[p]=b[L],ps[p]=1ll*b[L]*b[L]%mod;
        return;
    }
    int mid=L+R>>1;
    build(ls,L,mid),build(rs,mid+1,R);
    up;
}
void update(int p,int x,int v){
    if(l[p]==r[p]){
        ps[p]=1ll*v*v%mod,s[p]=v;
        return;
    }
    int mid=l[p]+r[p]>>1;
    if(x<=mid)update(ls,x,v);
    else update(rs,x,v);
    up;
}
ll qpow(ll a,int b=mod-2){
    ll res=1;
    while(b){
        if(b&1)res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
he query(int p,int L,int R){
    if(L<=l[p]&&r[p]<=R)return he(s[p],ps[p]);
    int mid=l[p]+r[p]>>1;
    he ans;
    if(L<=mid)ans=query(ls,L,R);
    if(R>mid)ans+=query(rs,L,R);
    up;
    return ans;
}

int main(){
	#ifndef ONLINE_JUDGE
	freopen("1.in","r",stdin);
	#endif
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;++i)cin>>b[i],inv[i]=i==1?1:1ll*(mod-mod/i)*inv[mod%i]%mod;
    build(1,1,n);
    for(int i=1;i<=m;++i){
        int op,x,y;
        ll len,in;
        cin>>op>>x>>y;
        in=inv[len=y-x+1];
        if(op==1)update(1,x,y);
        else{
            auto[h,pfh]=query(1,x,y);
            // cout<<h<<' '<<pfh<<'\n';
            ll p=h*in%mod;
            int ans=len*p%mod*p%mod;
            add(ans,pfh);
            sub(ans,p*h%mod*2%mod);
            ans=ans*in%mod;
            cout<<ans<<'\n';
            // cout<<p<<' '<<ans<<"\n\n";
        }
    }
    return 0;
}

标签:方差,int,inv,ans,区间,query,mod
From: https://www.cnblogs.com/wscqwq/p/17761925.html

相关文章

  • 面试必刷TOP101:2、链表内指定区间反转
    一、题目将一个节点数为size链表m 位置到n位置之间的区间反转,要求时间复杂度O(n),空间复杂度O(1)。例如:importjava.util.*;/**publicclassListNode{*intval;*ListNodenext=null;*}*/publicclassSolution{/****@paramhea......
  • R语言无套利区间模型期货期现研究:正向套利和反向套利次数、收益率分析华泰柏瑞300ETF
    全文链接:http://tecdat.cn/?p=31973最近我们被客户要求撰写关于无套利区间模型的研究报告,包括一些图形和统计输出。股指期货的套利交易有助于股指期货实现其价格发现以及风险规避的功能,因此提高套利交易的效率,对于发挥股指期货在经济发展中的作用有着重要的意义本文帮助客户对......
  • Python自动筛选、删除Excel不处于给定区间的数据
      本文介绍基于Python语言,读取Excel表格文件,基于我们给定的规则,对其中的数据加以筛选,将不在指定数据范围内的数据剔除,保留符合我们需要的数据的方法。  首先,我们来明确一下本文的具体需求。现有一个Excel表格文件(在本文中我们就以.csv格式的文件为例),如下图所示。  其中,Exc......
  • 如何处理一类多区间问题
    形如\(\sum_{i=l}^rM(L+i,R+i,x)\)一类问题不难发现这个东西实际上就是一堆等差数列,考虑这样高维差分我们在\(i\)处放一个1,就相当于在这里生成了一个公差为1等差数列,先在\(L+l\)处生成一个数列111111111111111111111 111111111 ......
  • 轮廓系数、方差比、DB指数(三种常见的聚类内部评价指标)
     1引言在之前的一篇文章(https://www.cnblogs.com/emanlee/p/17742869.html)中掌柜详细介绍了聚类算法中几种常见的评估指标,包括纯度(准确率)、精确率、召回率、兰德系数和F值等。虽然这些评价指标都能很好的评估聚类结果的优劣,但是它们都有着一个共同的缺点,需要知道训练样本的真......
  • Letter Picking (CF D) (区间DP, 暴力)(0,1,2 Alice 平 bob ,尽可能小,尽可能大)
     思路:区间dp(区间DP的时间复杂度不一定是n^3,可能是n^2更具题意)直接题直接区间dp,0Alice赢1平局2Bob赢(于是alice尽可能小,bob尽可能大)alice选l,bob可以选l+1,或者ralice选r,bob可选l或者r-1,看代码就行了#include<bits/stdc......
  • 合并区间(区间排序,vector的动态扩容的应用)
    以数组intervals表示若干个区间的集合,其中单个区间为intervals[i]=[starti,endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例1:输入:intervals=[[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间[1,3......
  • EI 的区间加正数区间最大子段和的 polylog 做法(KTT)
    非常有道理。orzEI。首先单点修改区间最大子段和是GSS的经典问题。我们维护出区间和\(sm\)、最大前缀和\(lmx\)、最大后缀和\(rmx\)、最大子段和\(mx\),发现这是一种半群信息,直接线段树维护就可以了。那么对于区间加正数问题,我们依然考虑线段树。线段树想要pushdown标记......
  • csps区间dp
    加分二叉树我们可以枚举中间这个k的位置,然后分别递归计算左右子树,这就让我们想到这是一个和区间有关的,我们可以用区间dp来解决。\(f[i][j]\)表示i,j这个区间的最大分值。用一个很板子的区间dp就可以解决了。至于求前序遍历,我们也只需要通过递归然后枚举中间的根,第一个满足......
  • 基础算法:区间合并
    1、区间合并以AcWing.803为例,题目要求如下:给定n个区间[li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:[1,3]和[2,6]可以合并为一个区间[1,6]。输入格式第一行包含整数n。接下来n行,每行包含两个整数l和r。输......