改了一下,样例过了,但还是0分
```cpp
#include <bits/stdc++.h>
using namespace std;
#define mid ((l + r) >> 1)
const int N = 1e5 + 5;
struct Node
{
double sum, sqsum, lazy;
} c[N << 2];
int n, m;
double a[N];
void build(int x, int l, int r)
{
if (l == r)
{
c[x].sum = a[l];
c[x].sqsum = a[l] * a[l];
return;
}
build(x << 1, l, mid);
build(x << 1 | 1, mid + 1, r);
c[x].sum = c[x << 1].sum + c[x << 1 | 1].sum;
c[x].sqsum = c[x << 1].sqsum + c[x << 1 | 1].sqsum;
}
void pushdown(int x, int l, int r)
{
c[x << 1].lazy += c[x].lazy;
c[x << 1].sqsum += c[x << 1].sum * c[x].lazy * 2 + c[x].lazy * c[x].lazy * (mid - l + 1);
c[x << 1].sum += (mid - l + 1) * c[x].lazy;
c[x << 1 | 1].lazy += c[x].lazy;
c[x << 1 | 1].sqsum += c[x << 1 | 1].sum * c[x].lazy * 2 + c[x].lazy * c[x].lazy * (r - mid);
c[x << 1 | 1].sum += (r - mid) * c[x].lazy;
c[x].lazy = 0;
}
void updata(int x, int l, int r, int s, int t, double k)
{
if (s <= l && r <= t)
{
c[x].lazy += k;
c[x].sqsum += c[x].sum * k * 2 + k * k * (r - l + 1);
c[x].sum += (r - l + 1) * k;
return;
}
if (c[x].lazy)
pushdown(x, l, r);
if (s <= mid)
updata(x << 1, l, mid, s, t, k);
if (t > mid)
updata(x << 1 | 1, mid + 1, r, s, t, k);
c[x].sum = c[x << 1].sum + c[x << 1 | 1].sum;
c[x].sqsum = c[x << 1].sqsum + c[x << 1 | 1].sqsum;
}
double query1(int x, int l, int r, int s, int t)
{
if (s <= l && r <= t)
return c[x].sum;
if (c[x].lazy)
pushdown(x, l, r);
double ans = 0;
if (s <= mid)
ans += query1(x << 1, l, mid, s, t);
if (t > mid)
ans += query1(x << 1 | 1, mid + 1, r, s, t);
return ans;
}
double query2(int x, int l, int r, int s, int t)
{
if (s <= l && r <= t)
return c[x].sqsum;
if (c[x].lazy)
pushdown(x, l, r);
double ans = 0;
if (s <= mid)
ans += query2(x << 1, l, mid, s, t);
if (t > mid)
ans += query2(x << 1 | 1, mid + 1, r, s, t);
return ans;
}
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, k;
cin >> op >> x >> y;
if (op == 1)
{
cin >> k;
updata(1, 1, n, x, y, k);
}
else if (op == 2)
printf("%.4lf\n", query1(1, 1, n, x, y) / (y - x + 1.0));
else
{
double dv = query2(1, 1, n, x, y) / (y - x + 1.0);
double f = query1(1, 1, n, x, y) / (y - x + 1.0);
printf("%.4lf\n", dv - f * f);
}
}
return 0;
}
```
by gogei @ 2024-01-30 12:27:36
@[gogei](/user/558202) 输入的k是实数要用double
by jokiii @ 2024-01-30 12:42:56
谢谢大佬,已关注
by gogei @ 2024-01-30 13:30:27