洛谷P5142 区间方差

(^ w ^)

题目背景

出题人并没有能力写有趣的题面……
题目描述

对于一个长度为n的序列a1,a2,a3⋯ana_1,a_2,a_3\cdots a_na1​,a2​,a3​⋯an​,我们定义它的平均数a为:

a=1n∑i=1naia=\frac{1}{n}\sum_{i=1}^{n}a_ia=n

1​∑i=1n​ai​

并定义它的方差d为:

d=1n∑i=1n(ai−a)2d=\frac{1}{n}\sum_{i=1}{n}(a_i-a)2d=n

1​∑i=1n​(ai​−a)2

现在给定一个长度为n的序列b1,b2⋯bnb_1,b_2\cdots b_nb1​,b2​⋯bn​。你需要支持两种操作。每种操作的格式为c x y。

若c=1,为修改操作,代表将bxb_xbx​赋值为y。

若c=2,为查询操作,代表查询bxb_xbx​到byb_yby​的方差。

为了避免浮点数误差,请以分数取模形式输出结果(对1000000007(109+710^9+7109+7)取模)。如果不知道什么是分数取模,请看下文。

对于一个正整数a,如果a÷M=p⋯ra\div M=p\cdots ra÷M=p⋯r,则称a模M为r。记为a≡r(mod M)a\equiv r(\mod ~M)a≡r(mod M)或者a%M=ra%M=ra%M=r。

对于一个正整数a,如果存在正整数b,使得a×b≡1(mod M)a\times b\equiv 1(\mod~M)a×b≡1(mod M),则称b为a的逆元,记为b=rev(a)b=rev(a)b=rev(a)。此题我们保证逆元一定存在。

对于一个分数ab\frac{a}{b}b

a​,其取模表示为:a×rev(b)%Ma\times rev(b)%Ma×rev(b)%M。

在此题中,M=1000000007(109+710^9+7109+7)。
输入输出格式
输入格式:

第一行两个数n,m,代表序列b的长度为n,有m个操作。

第二行n个整数bib_ibi​,表示序列b的初始值。

下面有m行整数,每行格式为c a b,含义如上文所示。保证所有操作合法。

输出格式:

对于每个操作2,输出一行。

输入输出样例
输入样例#1: 复制

4 8
0 0 0 0
1 1 1
1 2 2
1 3 3
1 4 4
2 1 1
2 1 2
2 1 3
2 1 4

输出样例#1: 复制

0
250000002
666666672
250000003

题解

反正没什么好说的,题目很好懂。我们稍微动一下笔可得到以下结论。
设:
原数组为ai\ a_{i} ai​
平均数为aa\ aa aa
方差为d\ d d
区间为[l,r]\ [l,r] [l,r]

aa=(∑i=lrai)÷(r−l+1)aa=(\sum_{i=l}^{r} a_{i}) \div (r-l+1) aa=(i=l∑r​ai​)÷(r−l+1)

d=∑i=lr(ai−aa)2d=\sum_{i=l}^{r} (a_{i}-aa)^{2} d=i=l∑r​(ai​−aa)2

化简一下得

d=∑i=lr(ai2−2ai⋅aa+aa2)=(r−l+1)aa2−2aa∑i=lrai+∑i=lrai2d=\sum_{i=l}^{r}(a_{i}^{2}-2a_{i} \cdot aa+aa^{2})=(r-l+1)aa^{2}-2aa\sum_{i=l}^{r}a_{i}+\sum_{i=l}^{r}a_{i}^{2} d=i=l∑r​(ai2​−2ai​⋅aa+aa2)=(r−l+1)aa2−2aai=l∑r​ai​+i=l∑r​ai2​

所以其实是一个区间和和区间平方和。
用树状数组维护。
AC代码。复杂度 O(nlog2n+mlog22n\ nlog_{2}n+mlog_{2}^{2}n nlog2​n+mlog22​n)

#include<bits/stdc++.h>
using namespace std;
long long n,m,c[100100],cs[100100];
const long long p=1000000007;
inline long long read()
{long long s=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch)){s=(s<<3)+(s<<1)+(ch^0x30);ch=getchar();}return w ? -s : s;
}
inline long long lowbit(long long x)
{return x&(-x);
}
inline long long quc(long long i)
{long long res=0;while(i){res=(res+c[i])%p;i-=lowbit(i);}return res;
}
inline long long qucs(long long i)
{long long res=0;while(i){res=(res+cs[i])%p;i-=lowbit(i);}return res;
}
inline long long inv(long long x)
{if(x==1) return 1;if(x<1) return 0;return (p-p/x)*inv(p%x)%p;
}
inline void change(long long i,long long k)
{long long d=k-(quc(i)-quc(i-1));long long t=i;while(t<=n){c[t]=(c[t]+d)%p;t+=lowbit(t);}d=k*k-(qucs(i)-qucs(i-1));t=i;while(t<=n){cs[t]=(cs[t]+d)%p;t+=lowbit(t);}
}
int main()
{memset(c,0,sizeof(c));memset(cs,0,sizeof(cs));n=read();m=read();long long i=1;while(i<=n){int a=read();if(a!=0) change(i,a);++i;}long long op;while(m--){op=read();if(op^1){long long l,r;l=read();r=read();if(l==r) printf("0\n");else{long long av,inve,ans=0;inve=inv(r-l+1);av=(quc(r)-quc(l-1))*inve%p;ans=((qucs(r)-qucs(l-1))%p-(av<<1)*(quc(r)-quc(l-1))%p)*inve%p;ans=((ans+av*av%p)%p+p)%p;printf("%d\n",ans);}}else{long long a,b;a=read();b=read();change(a,b);}}return 0;
}
/*
1996年:东方灵异传(TOH1)
1997年:东方封魔录(TOH2)
1997年:东方梦时空(TOH3)
1998年:东方幻想乡(TOH4)
1998年:东方怪绮谈(TOH5)
2002年:东方红魔乡(TOH6)
2003年:东方妖妖梦(TOH7)
2004年:东方萃梦想(TOH7.5)
2004年:东方永夜抄(TOH8)
2005年:东方花映冢(TOH9)
2005年:东方文花帖(TOH9.5)
2007年:东方风神录(TOH10)
2008年:东方绯想天(TOH10.5)
2008年:东方地灵殿(TOH11)
2009年:东方星莲船(TOH12)
2009年:东方非想天则(TOH12.3)
2010年:东方文花帖DS(TOH12.5)
2010年:东方三月精(TOH12.8)
2011年:东方神灵庙(TOH13)
2013年:东方心绮楼(TOH13.5)
2013年:东方辉针城(TOH14)
2014年:弹幕天邪鬼(TOH14.3)
2014年:东方深秘录(TOH14.5)
2015年:东方绀珠传(TOH15)
2017年:东方凭依华(TOH15.5)
2017年:东方天空璋(TOH16)
*/
//RP++!!!

总结

水题,题解里说的,我拿来水博客了。

(树状数组+逆元)洛谷P5142 区间方差相关推荐

  1. [树状数组][二分] 洛谷 P2161 会场预约

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  2. 树状数组求逆序对_区间和的个数(树状数组)

    327. 区间和的个数 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i ...

  3. 树状数组(单点修改,区间修改等)

    前言:上次练习树状数组的专题还是半年前,练了练就过了,后来学了线段树,觉得树状数组这啥啊,线段树不香吗,就再也没管过树状数组了.直到几天前被树状数组血虐了,急忙爬回来补树状数组.(事实证明学的越少,越 ...

  4. 洛谷P3374 【模板】树状数组 1

    题目链接:[模板]树状数组 1 - 洛谷 模板题就不多说了 ac代码: #include <cstdio> #include <iostream> #include <a ...

  5. 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间

    从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...

  6. [Split The Tree][dfs序+树状数组求区间数的种数]

    Split The Tree 时间限制: 1 Sec  内存限制: 128 MB 提交: 46  解决: 11 [提交] [状态] [讨论版] [命题人:admin] 题目描述 You are giv ...

  7. 数据结构——树状数组

    我们今天来讲一个应用比较广泛的数据结构--树状数组 它可以在O(nlogn)的复杂度下进行单点修改区间查询,下面我会分成三个模块对树状数组进行详细的解说,分别是树状数组基本操作.树状数组区间修改单点查 ...

  8. 0x42.数据结构进阶 - 树状数组

    目录 一.树状数组与逆序对 A.luogu P1908 逆序对(模板题) B.AcWing 241. 楼兰图腾 树状数组的拓展应用 1.区间加,求单点值 A.AcWing 242. 一个简单的整数问题 ...

  9. csu 1757(贪心或者树状数组)

    1757: 火车入站 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 209  Solved: 51 [Submit][Status][Web Boar ...

最新文章

  1. python使用imbalanced-learn的RandomUnderSampler方法进行下采样处理数据不平衡问题
  2. Comparative assessment of long-read error correction software applied to Nanopore RNA-sequencing dat
  3. python实现http下载文件-Python实现HTTP协议下的文件下载方法总结
  4. stm32 adc过采样_产生ADC误差的外部原因有哪些?
  5. Android Hook Java的的一个改进版本
  6. 文件服务器 工作站 通信媒体,【2013年自考“网络操作系统”复习资料(22)】- 环球网校...
  7. 设计模式(2)--Singleton(单例模式)--创建型
  8. 如何将RTC中基于AI的音频算法有效的产品化
  9. Chrome谷歌浏览器私密浏览自动开启功能获批专利
  10. Amazon S3数据一致性模型
  11. mysql 51cto 数据类型_Mysql数据类型
  12. 人人都是产品经理1.0
  13. 【菜鸡学算法】用最笨最直观的方法讨论递归取中值时是不是陷入死循环
  14. matlab朦胧的去雾、加雾算法
  15. Maven 中 com.adobe.blazeds 的配置失效解决方案
  16. mhdd测试hdd硬盘软件,硬盘检测工具mhdd
  17. Error Domain=AVFoundationErrorDomain Code=-11841 (null) timeRange 和 duration 不一致
  18. 浏览器中访问本地文件for mac
  19. 快讯:预装Ubuntu 11.10小电脑南非开卖
  20. 企业微信实现扫码登录

热门文章

  1. Python渗透测试工具库
  2. 解决swagger几种报错问题
  3. 【前端必备项目】品优购商城前端
  4. 深入解析go依赖注入库go.uber.org/fx
  5. 异或的4种神奇的运用场景
  6. Amy联通必免方案再次发力
  7. 大数据舞台中的Flink
  8. Fabric CA国密版本的一种替代方案--使用cryptogen工具增加新用户
  9. Linux--解决Windows和Ubuntu之间的复制粘贴问题
  10. 无需越狱,iPhone修改状态栏运营商名称