样例输出:
3.0000
2.0000
2.0000
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, a[2000005], tr[2000005], tag[2000005], tr2[2000005], tag2[2000005];
void pushup(int cur){
tr[cur] = tr[cur << 1] + tr[cur << 1 | 1];
tr2[cur] = tr2[cur << 1] + tr2[cur << 1 | 1];
}
void lazytag(int cur, int lt, int rt, int val){
tag[cur] += val;
tr[cur] += (rt - lt + 1) * val;
}
void lazytag2(int cur, int lt, int rt, int val){
tag2[cur << 1] += val;
tr2[cur << 1] += tr[cur << 1] * val * 2 + (rt - lt + 1) * (val * val);
}
void pushdown(int cur, int lt, int rt){
int mid = lt + rt >> 1;
lazytag2(cur << 1, lt, mid, tag2[cur]);
lazytag2(cur << 1 | 1, mid + 1, rt, tag2[cur]);
lazytag(cur << 1, lt, mid, tag[cur]);
lazytag(cur << 1 | 1, mid + 1, rt, tag[cur]);
tag[cur] = 0;
tag2[cur] = 0;
}
void build(int cur, int lt, int rt){
if(lt == rt){
tr[cur] = a[lt];
tr2[cur] = a[lt] * a[rt];
return;
}
int mid = lt + rt >> 1;
build(cur << 1, lt, mid);
build(cur << 1 | 1, mid + 1, rt);
pushup(cur);
}
double query(int cur, int lt, int rt, int qx, int qy){
if(lt > qy || rt < qx){
return 0;
}
if(qx <= lt && rt <= qy){
return tr[cur];
}
pushdown(cur, lt, rt);
int mid = lt + rt >> 1;
double x = query(cur << 1, lt, mid, qx, qy) + query(cur << 1 | 1, mid + 1, rt, qx, qy);
pushup(cur);
return x;
}
double query2(int cur, int lt, int rt, int qx, int qy){
if(lt > qy || rt < qx){
return 0;
}
if(qx <= lt && rt <= qy){
return tr2[cur];
}
pushdown(cur, lt, rt);
int mid = lt + rt >> 1;
double x = query2(cur << 1, lt, mid, qx, qy) + query2(cur << 1 | 1, mid + 1, rt, qx, qy);
pushup(cur);
return x;
}
void update(int cur, int lt, int rt, int qx, int qy, int val){
if(lt > qy || rt < qx){
return;
}
if(qx <= lt && rt <= qy){
lazytag(cur, lt, rt, val);
lazytag2(cur, lt, rt, val);
return;
}
pushdown(cur, lt, rt);
int mid = lt + rt >> 1;
update(cur << 1, lt, mid, qx, qy, val);
update(cur << 1 | 1, mid + 1, rt, qx, qy, val);
pushup(cur);
}
signed main(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
build(1, 1, n);
while(m--){
int op, x, y;
cin >> op >> x >> y;
if(op == 1){
int val;
cin >> val;;
update(1, 1, n, x, y, val);
}
else if(op == 2){
printf("%.4lf", 1.0 * query(1, 1, n, x, y) / (y - x + 1));
}
else{
double b = 1.0 * query(1, 1, n, x, y) / (y - x + 1);
printf("%.4lf", 1.0 * query2(1, 1, n, x, y) / (y - x + 1) - b * b);
}
}
return 0;
}
根据题解第二篇思路写的,求调