luogu P5142 区间方差 十分优美的线段树
又来了个维护方差的线段树。。。。
大致推导过程(字丑多包涵QAQ)
注意取模时要加一些100000007防止出现负数。。
#include<cstdio>
#include<iostream>
#define ll long long
#define R register long long
#define ls (tr<<1)
#define rs (tr<<1|1)
using namespace std;
const long long M=;
int n,m;
inline ll g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
ll sum[],po[];
void build(int tr,int l,int r) {
if(l==r) {sum[tr]=g(),po[tr]=sum[tr]*sum[tr]; return;}
R md=(l+r)>>;
build(ls,l,md),build(rs,md+,r);
sum[tr]=sum[ls]+sum[rs],po[tr]=po[ls]+po[rs];
}
void add(int tr,int l,int r,int pos,ll d) {
if(l==r) {sum[tr]=d%M; po[tr]=d*d%M; return ;}
R md=(l+r)>>;
if(pos>md) add(rs,md+,r,pos,d);
else if(pos<md+) add(ls,l,md,pos,d);
sum[tr]=(sum[ls]+sum[rs])%M,po[tr]=(po[ls]+po[rs])%M;
}
ll query(int tr,int l,int r,int LL,int RR) {
if(l==LL&&r==RR) return sum[tr];
R md=(l+r)>>;
if(LL>md) return query(rs,md+,r,LL,RR);
else if(RR<md+) return query(ls,l,md,LL,RR);
else return (query(ls,l,md,LL,md)+query(rs,md+,r,md+,RR))%M;
}
ll _query(int tr,int l,int r,int LL,int RR) {
if(l==LL&&r==RR) return po[tr];
R md=(l+r)>>;
if(LL>md) return _query(rs,md+,r,LL,RR);
else if(RR<md+) return _query(ls,l,md,LL,RR);
else return (_query(ls,l,md,LL,md)+_query(rs,md+,r,md+,RR))%M;
}
inline ll qpow(int a) {
R ret=,p=M-; a%=M;
for(;p;p>>=,(a*=a)%=M) if(p&) (ret*=a)%=M;
return ret;
}
inline ll Inv(int x) {
if(x==) return ; if(x<) return ;
return (M-M/x)*Inv(M%x)%M;
}
signed main() {
n=g(),m=g();
build(,,n);
for(R i=;i<=m;++i) {
R k=g(),l=g(),r=g();
if(k&) add(,,n,l,r);
else {
R inv=Inv(r-l+),ave=query(,,n,l,r)*inv%M;
printf("%lld\n",((_query(,,n,l,r)%M-(ave<<)*query(,,n,l,r)%M+M)*inv%M+ave*ave%M+M)%M);
}
}
}
也可树状数组,就不多说了(自己没写)(怕是树状数组更易写?)
2019.04.12
luogu P5142 区间方差 十分优美的线段树的更多相关文章
- Luogu 3373 又乘又加的线段树
Luogu 3373 又乘又加的线段树 当给一个节点加上一个加法标记时,直接把加法标记 += 新值: 当给一个节点加上一个乘法标记时,把乘法标记和加法标记同时 *= 新值.(注意pushdown函数中 ...
- luogu P3834 【模板】可持久化线段树 1(主席树) 查询区间 [l, r] 内的第 k 小/大值
————————————————版权声明:本文为CSDN博主「ModestCoder_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https:// ...
- Luogu 45887 全村最好的嘤嘤刀(线段树 树状数组)
https://www.luogu.org/problemnew/show/T45887 题目背景 重阳节到了,我们最好的八重樱拥有全村最好的嘤嘤刀…… 题目描述 在绯玉丸力量的影响下,八重村成了一条 ...
- Codeforces 719E [斐波那契区间操作][矩阵快速幂][线段树区间更新]
/* 题意:给定一个长度为n的序列a. 两种操作: 1.给定区间l r 加上某个数x. 2.查询区间l r sigma(fib(ai)) fib代表斐波那契数列. 思路: 1.矩阵操作,由矩阵快速幂求 ...
- bzoj 3196 && luogu 3380 JoyOI 1730 二逼平衡树 (线段树套Treap)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3196 题面; 3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Se ...
- zoj3299 线段树区间更新,坐标建立线段树的方式
/* 平台和砖块的坐标离散化,边缘坐标转换成单位长度 处理下落信息,sum数组维护区间的砖块数量 把平台按高度从高到低排序,询问平台区间的砖块有多少,询问后将该区域砖块数置0 */ #include& ...
- 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)
P4513 小白逛公园 题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩 ...
- ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...
- 【树状数组区间修改区间求和】codevs 1082 线段树练习 3
http://codevs.cn/problem/1082/ [AC] #include<bits/stdc++.h> using namespace std; typedef long ...
随机推荐
- HDOJ1171(多重背包)
#include<iostream> #include<cstdio> using namespace std; #define MAX(a,b) (a>b)?a:b + ...
- Asp.net mvc 网站之速度优化 -- 页面缓存
网站速度优化的一般方法 由于网站最重要的用户体验就是速度,特别是对于电子商务网站而言. 一般网站速度优化会涉及到几个方面: 1. 数据库优化 — 查询字段简历索引,使用数据库连接池和持久化,现在还有种 ...
- QTP连接数据库
'注意:其中DSN=数据源名:UID=用户名:PWD=用户密码 Dim Conn Set Conn=CreateObject("ADODB.Connection") Const C ...
- css菜鸟学习之block,inline和inline-block概念和区别
block,inline和inline-block概念和区别 总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) ...
- jquery获取设置服务器控件的方法
jquery获取设置服务器控件的方法 获取TextBox,HiddenField,Label的值.例如: <asp:TextBox ID="txtBoxID" runat=& ...
- navicat自动备份
http://blog.csdn.net/eastmount/article/details/70239244
- ADO.NET 对象
(一)OleDbConnection 使用COM组件链接 (二)ADO.NET 对对数据库访问做了优化: 1.SqlConnection 用于建立和Sql Server服务器连接的类,表示打开数据库 ...
- win10系统-javac不是内部或外部命令
给笔记本装了一个ssd,上午装的系统,重新搞jdk,设置JAVA_HOME之后,cmd运行javac报 “javac不是内部或外部命令”各种懵逼,试了好几次才发现Path路径里面不能用%JAVA_HO ...
- url传参解决中文乱码
跳转前: window.open("http://localhost:9728/content/agent/devolution.html?search_agent=" + enc ...
- mac下已装virtualbox运行genymotion还报错找不到虚拟机的解决办法
sudo ln -s /usr/local/bin/VBoxManage /usr/bin/VBoxManage