线段树,方差,数学(Variance,玲珑杯 Round#5 H lonlife 1063)
2016-11-26 18:31
260 查看
以前只知道方差=(∑(xi-x)^2)/n,1<=i<=n。x是平均数
没有办法用一棵线段树来维护方差。
现在知道了方差=Var[x] = E[x^2] - E[x]^2,就是平方的期望减去期望的平方。
所以用两颗线段树分别维护区间和与平方的区间和。然后算出答案就好了。
我们都知道,我们都知道,但我咋就不知道呢
以后要多打比赛,感觉打比赛收获很大。
代码
#include<bits/stdc++.h>
#define ls (now<<1)
#define rs (ls|1)
using namespace std;
typedef long long ll;
const ll maxn=(1<<16)+10;
typedef pair<double,double> pdd;
ll n,m;
ll a[maxn];
double tree1[maxn<<2];
double tree2[maxn<<2];
void up_data(ll now)
{
tree1[now]=tree1[ls]+tree1[rs];
tree2[now]=tree2[ls]+tree2[rs];
}
ll K;
void BUILD(ll l,ll r,ll now)
{
if(l==r)
{
tree1[now]=a[K];
tree2[now]=a[K]*a[K];
K++;
return;
}
ll m=(l+r)>>1;
BUILD(l,m,ls);
BUILD(m+1,r,rs);
up_data(now);
}
void A(ll l,ll r,ll now,ll pos,ll val)
{
if(l==r)
{
tree1[now]=val;
tree2[now]=val*val;
return;
}
ll m=(l+r)>>1;
if(pos<=m) A(l,m,ls,pos,val);
else A(m+1,r,rs,pos,val);
up_data(now);
}
pdd Q(ll l,ll r,ll now,ll ql,ll qr)
{
if(ql<=l&&r<=qr) return make_pair(tree1[now],tree2[now]);
ll m=(l+r)>>1;
pdd ansl=make_pair(0,0);
pdd ansr=make_pair(0,0);
if(ql<=m) ansl=Q(l,m,ls,ql,qr);
if(qr>m) ansr=Q(m+1,r,rs,ql,qr);
return make_pair(ansl.first+ansr.first,ansl.second+ansr.second);
}
int main()
{
while(scanf("%lld %lld",&n,&m)==2)
{
for(ll i=1;i<=n;i++)
scanf("%lld",&a[i]);
K=1;
BUILD(1,n,1);
ll x,y;
while(m--)
{
scanf("%lld",&x);
if(x==1)
{
scanf("%lld %lld",&x,&y);
A(1,n,1,x,y);
}
else
{
scanf("%lld %lld",&x,&y);
ll l=y-x+1;
pdd p=Q(1,n,1,x,y);
printf("%lld\n",ll(floor((p.second/l-(p.first*p.first/l/l))*l*l+0.5)));
}
}
}
return 0;
}
没有办法用一棵线段树来维护方差。
现在知道了方差=Var[x] = E[x^2] - E[x]^2,就是平方的期望减去期望的平方。
所以用两颗线段树分别维护区间和与平方的区间和。然后算出答案就好了。
我们都知道,我们都知道,但我咋就不知道呢
以后要多打比赛,感觉打比赛收获很大。
代码
#include<bits/stdc++.h>
#define ls (now<<1)
#define rs (ls|1)
using namespace std;
typedef long long ll;
const ll maxn=(1<<16)+10;
typedef pair<double,double> pdd;
ll n,m;
ll a[maxn];
double tree1[maxn<<2];
double tree2[maxn<<2];
void up_data(ll now)
{
tree1[now]=tree1[ls]+tree1[rs];
tree2[now]=tree2[ls]+tree2[rs];
}
ll K;
void BUILD(ll l,ll r,ll now)
{
if(l==r)
{
tree1[now]=a[K];
tree2[now]=a[K]*a[K];
K++;
return;
}
ll m=(l+r)>>1;
BUILD(l,m,ls);
BUILD(m+1,r,rs);
up_data(now);
}
void A(ll l,ll r,ll now,ll pos,ll val)
{
if(l==r)
{
tree1[now]=val;
tree2[now]=val*val;
return;
}
ll m=(l+r)>>1;
if(pos<=m) A(l,m,ls,pos,val);
else A(m+1,r,rs,pos,val);
up_data(now);
}
pdd Q(ll l,ll r,ll now,ll ql,ll qr)
{
if(ql<=l&&r<=qr) return make_pair(tree1[now],tree2[now]);
ll m=(l+r)>>1;
pdd ansl=make_pair(0,0);
pdd ansr=make_pair(0,0);
if(ql<=m) ansl=Q(l,m,ls,ql,qr);
if(qr>m) ansr=Q(m+1,r,rs,ql,qr);
return make_pair(ansl.first+ansr.first,ansl.second+ansr.second);
}
int main()
{
while(scanf("%lld %lld",&n,&m)==2)
{
for(ll i=1;i<=n;i++)
scanf("%lld",&a[i]);
K=1;
BUILD(1,n,1);
ll x,y;
while(m--)
{
scanf("%lld",&x);
if(x==1)
{
scanf("%lld %lld",&x,&y);
A(1,n,1,x,y);
}
else
{
scanf("%lld %lld",&x,&y);
ll l=y-x+1;
pdd p=Q(1,n,1,x,y);
printf("%lld\n",ll(floor((p.second/l-(p.first*p.first/l/l))*l*l+0.5)));
}
}
}
return 0;
}
相关文章推荐
- “玲珑杯”ACM比赛 Round #5 H -- Variance(线段树+方差)
- 【玲珑学院OJ1063】Variance(线段树)
- 玲珑杯 H -- Variance(线段树)
- “玲珑杯” 线上赛 Round #5 Variance(线段树)
- 机器学习之数学基础——期望、方差、协方差、相关系数、矩、协方差矩阵
- 【“玲珑杯”ACM比赛 Round #20 H】康娜的数学课
- 偏差(Bias)-方差(Variance)权衡(tradeoff)
- 【luogu1471】方差(线段树)
- 数学期望与方差E(X) D(X)
- 51NOD 1098 最小方差(基础数学)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 偏差(bias)和方差(variance)及其与K折交叉验证的关系
- 2017ICPC北京赛区网络赛 Minimum(数学+线段树)
- 线段树——洛谷 P1471 方差
- 模型选择之诊断偏离bias和方差variance的区别
- 机器学习中的数学(2)-线性回归,偏差、方差权衡
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 模型评估-偏差bias和方差variance
- 机器学习入门系列03,Error的来源:偏差和方差(bias和variance)
- 机器学习中的数学(2)-线性回归,偏差、方差权衡