线段树求助
  • 板块P1471 方差
  • 楼主huangkx
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/10/6 15:08
  • 上次更新2023/11/4 04:35:21
查看原帖
线段树求助
232838
huangkx楼主2021/10/6 15:08

RTRT
过不了样例。。。
求大佬帮忙康康。

#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
2021/10/6 15:08
加载中...