“玲珑杯” 线上赛 Round #5 Variance(线段树)
2017-09-10 17:56
246 查看
1063 -- Variance
线段树:1.单点更新 2.区间方差 *(r-l+1)^2
ps:方差:Var[x]=E[x^2]-E[x]^2
代码:
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn=2<<18;
LL a[maxn];
LL sum[maxn];
void pushup(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
a[rt]=a[rt<<1]+a[rt<<1|1];
}
void build(int l,int r,int rt){
if(l==r){
scanf("%d",&sum[rt]);
a[rt]=sum[rt]*sum[rt];
return ;
}
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
pushup(rt);
}
void update(int p,int add,int l,int r,int rt){
if(l==r){
sum[rt]=add;
a[rt]=add*add;
return ;
}
int m=(l+r)>>1;
if(p<=m) update(p,add,l,m,rt<<1);
else update(p,add,m+1,r,rt<<1|1);
pushup(rt);
}
LL query1(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return sum[rt];
}
int m = (l + r) >> 1;
LL ret = 0;
if (L <= m) ret += query1(L,R,l,m,rt<<1);
if (R > m) ret+= query1(L,R,m+1,r,rt<<1|1);
return ret;
}
LL query2(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return a[rt];
}
int m = (l + r) >> 1;
LL ret = 0;
if (L <= m) ret += query2(L,R,l,m,rt<<1);
if (R > m) ret+= query2(L,R,m+1,r,rt<<1|1);
return ret;
}
int main(){
int n,m,q,l,r;
scanf("%d%d",&n,&m);
build(1,n,1);
while(m--){
scanf("%d%d%d",&q,&l,&r);
if(q==1){
update(l,r,1,n,1);
}else{
LL s=query1(l,r,1,n,1);
LL d=query2(l,r,1,n,1);
int e=r-l+1;
LL ans=d*e-s*s;
printf("%lld\n",ans);
}
}
return 0;
}
线段树:1.单点更新 2.区间方差 *(r-l+1)^2
ps:方差:Var[x]=E[x^2]-E[x]^2
代码:
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn=2<<18;
LL a[maxn];
LL sum[maxn];
void pushup(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
a[rt]=a[rt<<1]+a[rt<<1|1];
}
void build(int l,int r,int rt){
if(l==r){
scanf("%d",&sum[rt]);
a[rt]=sum[rt]*sum[rt];
return ;
}
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
pushup(rt);
}
void update(int p,int add,int l,int r,int rt){
if(l==r){
sum[rt]=add;
a[rt]=add*add;
return ;
}
int m=(l+r)>>1;
if(p<=m) update(p,add,l,m,rt<<1);
else update(p,add,m+1,r,rt<<1|1);
pushup(rt);
}
LL query1(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return sum[rt];
}
int m = (l + r) >> 1;
LL ret = 0;
if (L <= m) ret += query1(L,R,l,m,rt<<1);
if (R > m) ret+= query1(L,R,m+1,r,rt<<1|1);
return ret;
}
LL query2(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return a[rt];
}
int m = (l + r) >> 1;
LL ret = 0;
if (L <= m) ret += query2(L,R,l,m,rt<<1);
if (R > m) ret+= query2(L,R,m+1,r,rt<<1|1);
return ret;
}
int main(){
int n,m,q,l,r;
scanf("%d%d",&n,&m);
build(1,n,1);
while(m--){
scanf("%d%d%d",&q,&l,&r);
if(q==1){
update(l,r,1,n,1);
}else{
LL s=query1(l,r,1,n,1);
LL d=query2(l,r,1,n,1);
int e=r-l+1;
LL ans=d*e-s*s;
printf("%lld\n",ans);
}
}
return 0;
}
相关文章推荐
- “玲珑杯”ACM比赛 Round #5 H -- Variance(线段树+方差)
- “玲珑杯”线上赛 Round #15 河南专场 H -- 喵哈哈村的战斗魔法师丶坏坏い月 分块/线段树
- 玲珑杯 H -- Variance(线段树)
- “玲珑杯”ACM比赛 Round #5 H -- Variance 简单树状数组
- 线段树,方差,数学(Variance,玲珑杯 Round#5 H lonlife 1063)
- “玲珑杯”线上赛 Round #15 咸鱼魔法记(二分搜索)
- “玲珑杯”线上赛 Round #17 Sin your life(数学知识)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 【玲珑学院OJ1063】Variance(线段树)
- 玲珑杯 1164 - 战舰萝莉 线段树水题
- “玲珑杯”线上赛 Round #15 河南专场 C 咸鱼魔法记
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯”ACM比赛 Round #5
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- “玲珑杯”线上赛 Round #15 咸鱼魔法记(尺取法)
- “玲珑杯”线上赛Round#17河南专场 A. Sin your life
- 玲珑杯#3 G 1043 - G. Quailty and Square Counter【线段树-卡常数】
- “玲珑杯”ACM比赛 Round #5 C -- Coco(递归)
- 玲珑杯 1117 - RE:从零开始的异世界生活(线段树)
- 玲珑杯1128--线段树模板