(树状数组+逆元)洛谷P5142 区间方差
洛谷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
d=1n∑i=1n(ai−a)2d=\frac{1}{n}\sum_{i=1}{n}(a_i-a)2d=n
现在给定一个长度为n的序列b1,b2⋯bnb_1,b_2\cdots b_nb1,b2⋯bn。你需要支持两种操作。每种操作的格式为c x y。
若c=2,为查询操作,代表查询bxb_xbx到byb_yby的方差。
为了避免浮点数误差,请以分数取模形式输出结果(对1000000007(109+710^9+7109+7)取模)。如果不知道什么是分数取模,请看下文。
a,其取模表示为:a×rev(b)%Ma\times rev(b)%Ma×rev(b)%M。
在此题中,M=1000000007(109+710^9+7109+7)。
输入输出格式
输入格式:
下面有m行整数,每行格式为c a b,含义如上文所示。保证所有操作合法。
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
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∑rai)÷(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∑rai+i=l∑rai2
所以其实是一个区间和和区间平方和。
用树状数组维护。
AC代码。复杂度 O(nlog2n+mlog22n\ nlog_{2}n+mlog_{2}^{2}n nlog2n+mlog22n)
#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 区间方差相关推荐
- [树状数组][二分] 洛谷 P2161 会场预约
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- 树状数组求逆序对_区间和的个数(树状数组)
327. 区间和的个数 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i ...
- 树状数组(单点修改,区间修改等)
前言:上次练习树状数组的专题还是半年前,练了练就过了,后来学了线段树,觉得树状数组这啥啊,线段树不香吗,就再也没管过树状数组了.直到几天前被树状数组血虐了,急忙爬回来补树状数组.(事实证明学的越少,越 ...
- 洛谷P3374 【模板】树状数组 1
题目链接:[模板]树状数组 1 - 洛谷 模板题就不多说了 ac代码: #include <cstdio> #include <iostream> #include <a ...
- 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间
从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...
- [Split The Tree][dfs序+树状数组求区间数的种数]
Split The Tree 时间限制: 1 Sec 内存限制: 128 MB 提交: 46 解决: 11 [提交] [状态] [讨论版] [命题人:admin] 题目描述 You are giv ...
- 数据结构——树状数组
我们今天来讲一个应用比较广泛的数据结构--树状数组 它可以在O(nlogn)的复杂度下进行单点修改区间查询,下面我会分成三个模块对树状数组进行详细的解说,分别是树状数组基本操作.树状数组区间修改单点查 ...
- 0x42.数据结构进阶 - 树状数组
目录 一.树状数组与逆序对 A.luogu P1908 逆序对(模板题) B.AcWing 241. 楼兰图腾 树状数组的拓展应用 1.区间加,求单点值 A.AcWing 242. 一个简单的整数问题 ...
- csu 1757(贪心或者树状数组)
1757: 火车入站 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 209 Solved: 51 [Submit][Status][Web Boar ...
最新文章
- python使用imbalanced-learn的RandomUnderSampler方法进行下采样处理数据不平衡问题
- Comparative assessment of long-read error correction software applied to Nanopore RNA-sequencing dat
- python实现http下载文件-Python实现HTTP协议下的文件下载方法总结
- stm32 adc过采样_产生ADC误差的外部原因有哪些?
- Android Hook Java的的一个改进版本
- 文件服务器 工作站 通信媒体,【2013年自考“网络操作系统”复习资料(22)】- 环球网校...
- 设计模式(2)--Singleton(单例模式)--创建型
- 如何将RTC中基于AI的音频算法有效的产品化
- Chrome谷歌浏览器私密浏览自动开启功能获批专利
- Amazon S3数据一致性模型
- mysql 51cto 数据类型_Mysql数据类型
- 人人都是产品经理1.0
- 【菜鸡学算法】用最笨最直观的方法讨论递归取中值时是不是陷入死循环
- matlab朦胧的去雾、加雾算法
- Maven 中 com.adobe.blazeds 的配置失效解决方案
- mhdd测试hdd硬盘软件,硬盘检测工具mhdd
- Error Domain=AVFoundationErrorDomain Code=-11841 (null) timeRange 和 duration 不一致
- 浏览器中访问本地文件for mac
- 快讯:预装Ubuntu 11.10小电脑南非开卖
- 企业微信实现扫码登录