luogu P5142 区间方差

本题要求维护模区间方差,很明显是一道数据结构题。

我们化简方差公式:


而平均数等于

可以发现,我们只需要维护序列的区间和和区间平方和,就可以维护平均数和方差。

区间和和区间平方和都满足结合律,因此可以用线段树维护。

题目要求分数取模, 所以我们使用乘法逆元即可。
最终答案为
psum−sum2n%mod\frac {psum - sum^2}{n}\%modnpsum−sum2​%mod

=(psum∗nmod−2%mod+(sum∗nmod−2%mod)2)%mod=(psum*n^{mod-2}\%mod+(sum*n^{mod-2}\%mod)^2)\%mod=(psum∗nmod−2%mod+(sum∗nmod−2%mod)2)%mod

其中
线段树维护的区间平方和 psumpsumpsum
psum=∑i=1nxi2psum = \sum_{i = 1}^{n}{x_i^2}psum=i=1∑n​xi2​
线段树维护的区间和 sumsumsum
sum=∑i=1nxisum = \sum_{i = 1}^{n}{x_i}sum=i=1∑n​xi​

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define get_mod(x) (x % mod + mod ) % mod
using namespace std;
typedef long long ll;
const int N = 500007, mod = 1e9 + 7;int n, m;
int a[N];
int cnt;int qpow(int b, int p = mod - 2, int m = mod)
{//快速幂用于费马小定理求乘法逆元b %= m;int res = 1 % m;for(; p; p >>= 1, b = (ll)b * b % m)if(p & 1)res = (ll)res * b % m;return res;
}namespace tree
{#define get_powsum(x) ((ll)(x)*(x)%mod) //!struct tree{int l, r;int sum, psum;//int lz;}tr[N];inline void pushup(int p){tr[p].sum = (tr[p << 1].sum + tr[p << 1 | 1].sum) % mod;tr[p].psum = (tr[p << 1].psum + tr[p << 1 | 1].psum) % mod;}void build(int p, int l, int r){tr[p] = {l, r};if(l == r){tr[p].sum = a[r] % mod;tr[p].psum = get_powsum(a[r]) % mod;return ;}int mid = l + r >> 1;build(p << 1, l, mid), build(p << 1 | 1, mid + 1, r);pushup(p);}void modify(int p, int x, int k){if(tr[p].l == tr[p].r){tr[p].sum = k % mod;tr[p].psum = get_powsum(k) % mod;return ;}int mid = tr[p].l + tr[p].r >> 1;if(x <= mid)modify(p << 1, x, k);else modify(p << 1 | 1, x, k);pushup(p);}int query_sum(int p, int l, int r){if(tr[p].l >= l && tr[p].r <= r){return tr[p].sum % mod;}int mid = tr[p].l + tr[p].r >> 1;int res = 0;if(l <= mid)res = query_sum(p << 1, l, r) % mod;if(r > mid)res = (1ll * res +  query_sum(p << 1 | 1, l, r)) % mod;return res % mod;}int query_psum(int p, int l, int r){if(tr[p].l >= l && tr[p].r <= r){return tr[p].psum % mod;}int mid = tr[p].l + tr[p].r >> 1;int res = 0;if(l <= mid)res = query_psum(p << 1, l, r) % mod;if(r > mid)res = (1ll * res +  query_psum(p << 1 | 1, l, r)) % mod;return res % mod;}
}int sum, psum, inv, ave, ans;int main()
{scanf("%d%d", &n, &m);for(int i = 1; i <= n; ++ i)scanf("%d", &a[i]);tree::build(1, 1, n);for(int i = 1; i <= m; ++ i){int op, x, y;scanf("%d%d%d", &op, &x, &y);if(op == 1){tree::modify(1, x, y % mod);}else {sum = tree::query_sum(1, x, y % mod) % mod;   //区间和psum = tree::query_psum(1, x, y % mod) % mod; //区间平方和inv = qpow(y - x + 1);                  //区间长度(分母)的逆元ave = (ll)sum * inv % mod;ans = (ll)psum * inv % mod - (ll)ave * ave % mod;ans = get_mod(ans);printf("%d\n", ans);//cout << "ok" << cnt ++ << endl;}}return 0;
}

luogu P5142 区间方差(线段树、乘法逆元)相关推荐

  1. (树状数组+逆元)洛谷P5142 区间方差

    洛谷P5142 区间方差 (^ w ^) 题目背景 出题人并没有能力写有趣的题面-- 题目描述 对于一个长度为n的序列a1,a2,a3⋯ana_1,a_2,a_3\cdots a_na1​,a2​,a ...

  2. 27.CF1004F Sonya and Bitwise OR 区间合并线段树

    27.CF1004F Sonya and Bitwise OR 区间合并线段树 个人Limitの线段树题单题解主目录:Limitの线段树题单 题解目录_HeartFireY的博客-CSDN博客 给定序 ...

  3. luogu P1471 方差 P5142 区间方差

    背景: 话说今天晚上就要去丰山那边上课了. 数学竞赛昨天考完了,碰见几个某 J J J中学的朋友(政治敏感话题), 好像看反了题. 又合并了两道题. 题目传送门: https://www.luogu. ...

  4. P1712-[NOI2016]区间【线段树,尺取法】

    正题 题目链接:https://www.luogu.com.cn/problem/P1712 题目大意 nnn个区间,求出其中mmm个区间使得它们有覆盖同一个点且最长区间长度减去最短长度最小. 解题思 ...

  5. 强制在线带修区间LCM(线段树+质因子状压)

    题目链接:信息学奥赛比赛系统 | 强制在线带修区间LCM (qduoj.com) 先说点题外话,这个题目困扰了我一天多,刚ac,真的是太爽了,感觉从这里面学到的东西挺多的,所以就来分享一下. 题目的意 ...

  6. [ Luogu 3924 ] 康纳的线段树

    \(\\\) \(Description\) 现在有一个线段树维护长为\(N\)的数列,实现方式是\(mid=((l+r)>>1)\),支持区间加,节点维护区间和. 共有\(M\)次区间加 ...

  7. [UOJ #222][NOI2016]区间(线段树)

    Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x ...

  8. Luogu P1198 [JSOI2008]最大数 线段树

    P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: ...

  9. 牛客 - 求函数(线段树+区间合并/线段树+矩阵维护)

    题目链接:点击查看 题目大意:现在有 n 个函数,每个函数都是诸如 f( x ) = k * x + b 的形式,只是每个函数的 k 和 b 都是相互独立的,现在给出两个操作: 1 pos k b:将 ...

最新文章

  1. 【Linux】普通用户修改 root 权限文件,没有权限;sudo: 没有终端存在,且未指定 askpass 程序
  2. K8s Ingress Provider 为什么选择 MSE 云原生网关?
  3. .Net程序员安卓学习之路5:使用xutils注入View和事件以及图片的显示
  4. 智能实验室-全能优化(Guardio) 4.0.0.670 beta 8
  5. Alluxio完成C轮5000万美元融资,新设中国区总部力拓国内市场
  6. HDU 1162 Eddy's picture (最小生成树)(java版)
  7. python爬取歌词_利用Python网络爬虫抓取网易云音乐歌词
  8. m3u8 video ios h5_移动端H5页面踩坑记
  9. Maven+SpringMVC+Dubbo 简单的入门demo配置(另一篇)
  10. java simpedateformat_java中Date,SimpleDateFormat
  11. 性能测试流程(超级详细)
  12. python tokenize()_tokenize (Language) – Python 中文开发手册 - Break易站
  13. 未来科技蒲公英大飞_大烟草的下跌告诉我们关于大科技的未来
  14. 二三类户开户风险和交易风险再讲
  15. 牛客剪刀石头布Java 模拟+贪心
  16. 中国石油大学《混凝土》第二阶段在线作业
  17. ae教程 (五)滤镜特效 (一)
  18. 基本shell命令学习
  19. 编译原理第二版6.2答案
  20. mysql 中文乱码问题解决(复制粘贴就可以解决)

热门文章

  1. 实战|基于图割算法的木材表面缺陷图像分析
  2. 【重磅】斯坦福李飞飞最新《注意力与Transformer》总结,84页ppt下载!
  3. 基于深度连续融合的多传感器三维目标检测
  4. 使用 Docker 搭建 Laravel 本地环境
  5. Python学习系列(五)(文件操作及其字典)
  6. java- ASM 字节码操控框架
  7. ios6:新特征介绍
  8. IT运维包括最基本的三个方面
  9. 2.算法-程序的灵魂
  10. java enum变量_java enum