RT
各位 dalao 帮调一下,谢谢了。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int _ = 1e5 + 7;
struct Node {
double Ssum, sum;
double lazy;
Node () {lazy = Ssum = sum = 0.0;}
} tree[_ << 2];
double a[_];
int lson(int root) {return root << 1;}
int rson(int root) {return root << 1 | 1;}
Node Merge(Node Tx, Node Ty, int Lazy) {
Node res;
res.Ssum = Tx.Ssum + Ty.Ssum, res.sum = Tx.sum + Ty.sum;
res.lazy = Lazy;
return res;
}
void Push_down(int l, int r, int root) {
if (tree[root].lazy) {
int mid = l + r >> 1;
tree[lson(root)].Ssum += (mid - l + 1) * tree[root].lazy * tree[root].lazy + tree[lson(root)].sum * tree[root].lazy * 2 * 1ll;
tree[rson(root)].Ssum += (r - (mid + 1) + 1) * tree[root].lazy * tree[root].lazy + tree[rson(root)].sum * tree[root].lazy * 2 * 1ll;
tree[lson(root)].sum += (mid - l + 1) * tree[root].lazy * 1ll, tree[rson(root)].sum += (r - (mid + 1) + 1) * tree[root].lazy * 1ll;
tree[lson(root)].lazy += tree[root].lazy * 1ll, tree[rson(root)].lazy += tree[root].lazy * 1ll;
tree[root].lazy = 0;
}
}
void Build(int l, int r, int root) {
if (l == r) {
tree[root].Ssum = a[l] * a[l], tree[root].sum = a[l];
return ;
}
int mid = l + r >> 1;
Build(l, mid, lson(root));
Build(mid + 1, r, rson(root));
tree[root] = Merge(tree[lson(root)], tree[rson(root)], 0);
}
void Change(int l, int r, int root, int L, int R, int k) {
if (r < L or R < l) return ;
if (L <= l and r <= R) {
tree[root].lazy += k;
tree[root].Ssum += (r - l + 1) * k * k + tree[root].sum * k * 2 * 1ll;
tree[root].sum += (r - l + 1) * k * 1ll;
return ;
}
Push_down(l, r, root);
int mid = l + r >> 1;
Change(l, mid, lson(root), L, R, k);
Change(mid + 1, r, rson(root), L , R, k);
tree[root] = Merge(tree[lson(root)], tree[rson(root)], tree[root].lazy);
}
Node Query(int l, int r, int root, int L, int R) {
if (l > R or L > r) return Node();
if (L <= l and r <= R) return tree[root];
Push_down(l, r, root);
int mid = l + r >> 1;
return Merge(Query(l, mid, lson(root), L, R), Query(mid + 1, r, rson(root), L, R), 0);
}
signed main() {
int n, m;
double k;
cin >> n >> m;
for (int i = 1; i <= n; ++ i) cin >> a[i];
Build(1, n, 1);
for (int i = 1, op, l, r; i <= m; ++ i) {
cin >> op >> l >> r;
if (op == 1) {
cin >> k;
Change(1, n, 1, l, r, k);
} else if (op == 2){
Node res = Query(1, n, 1, l, r);
printf("%.4lf\n", res.sum / (r - l + 1) * 1ll * 1.0);
} else if (op == 3) {
Node res = Query(1, n, 1, l, r);
printf("%.4lf\n", (double)(res.Ssum / (r - l + 1) * 1ll * 1.0 - res.sum / (r - l + 1) * res.sum / (r - l + 1) * 1ll));
}
}
return 0;
}