RT
过不了样例。。。
求大佬帮忙康康。
#include <bits/stdc++.h>
using namespace std;
int n, m;
int opt, L, R;
double X;
double a[1000005];
double sum1[1000005];
double sum2[1000005];
double lazy[1000005];
void push_up(int u)
{
sum1[u] = sum1[u<<1] + sum1[u<<1|1];
sum2[u] = sum2[u<<1] + sum2[u<<1|1];
}
void push_down(int u, int l, int r)
{
if(lazy[u] == 0) return;
int mid = (l + r) >> 1;
sum2[u<<1] += 2.0 * sum1[u<<1] * lazy[u] + (mid - l + 1) * lazy[u] * lazy[u];
sum2[u<<1|1] += 2.0 * sum1[u<<1|1] * lazy[u] + (r - mid) * lazy[u] * lazy[u];
sum1[u<<1] += lazy[u] * (mid - l + 1);
sum1[u<<1|1] += lazy[u] * (r - mid);
lazy[u<<1] += lazy[u];
lazy[u<<1|1] += lazy[u];
lazy[u] = 0;
}
void build(int u, int l, int r)
{
if(l > r) return;
if(l == r){
sum1[u] = a[l];
sum2[u] = a[l] * a[l];
return;
}
int mid = (l + r) >> 1;
build(u<<1, l, mid);
build(u<<1|1, mid+1, r);
push_up(u);
}
void change(int u, int l, int r, int L, int R, double X)
{
if(l > r || l > R || r < L) return;
if(l >= L && r <= R){
sum2[u] = 2.0 * sum1[u] * X + (r - l + 1) * X * X;
sum1[u] += (r - l + 1) * X;
lazy[u] += X;
return;
}
push_down(u, l, r);
int mid = (l + r) >> 1;
change(u<<1, l, mid, L, R, X);
change(u<<1|1, mid+1, r, L, R, X);
push_up(u);
}
double query1(int u, int l, int r, int L, int R)
{
if(l > r || l > R || r < L) return 0;
if(l >= L && r <= R) return sum1[u];
push_down(u, l, r);
int mid = (l + r) >> 1;
double l_res = query1(u<<1, l, mid, L, R);
double r_res = query1(u<<1|1, mid+1, r, L, R);
return l_res + r_res;
}
double query2(int u, int l, int r, int L, int R)
{
if(l > r || l > R || r < L) return 0;
if(l >= L && r <= R) return sum2[u];
push_down(u, l, r);
int mid = (l + r) >> 1;
double l_res = query2(u<<1, l, mid, L, R);
double r_res = query2(u<<1|1, mid+1, r, L, R);
return l_res + r_res;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++) scanf("%lf", &a[i]);
build(1, 1, n);
while(m--){
scanf("%d", &opt);
if(opt == 1){
scanf("%d%d%lf", &L, &R, &X);
change(1, 1, n, L, R, X);
}
if(opt == 2){
scanf("%d%d", &L, &R);
printf("%.4lf\n", query1(1, 1, n, L, R) / (R - L + 1));
}
if(opt == 3){
scanf("%d%d", &L, &R);
double x = query1(1, 1, n, L, R) / (R - L + 1);
double y = query2(1, 1, n, L, R) / (R - L + 1);
printf("%.4lf %.4lf\n", y, x);
}
}
return 0;
}
//WA