当前位置: 首页 > news >正文

O - 方差

 

 

思路:

首先他是实数

  1. 线段树结构

    • 每个节点存储三个关键值:区间和sum、区间平方和sum2、延迟标记lazy
    • sum用于计算区间平均数,sum2sum一起用于计算区间方差。
  2. 延迟标记优化

    • 当需要更新一个区间时,不立即更新所有子节点,而是将更新操作存储在延迟标记中。
    • 当需要访问某个节点时,先将延迟标记下传到子节点,确保数据的正确性。
  3. 方差计算

    • 方差公式:
    • 利用线段树维护的sumsum2,可以高效计算这两个部分。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n, m;
struct {double sum;double lazy;double sum2;
}  a[400005];
double b[100005];
void Chu(int x, int y, int i) {if (x == y) {a[i].sum = b[x];a[i].sum2 = pow(b[x], 2);a[i].lazy = 0;return;}int mid = (x + y) / 2;Chu(x, mid, i * 2);Chu(mid + 1, y, i * 2 + 1);a[i].sum2 = a[i * 2].sum2 + a[i * 2 + 1].sum2;a[i].sum = a[i * 2].sum + a[i * 2 + 1].sum;a[i].lazy = 0;
}
void Xiu(int x, int y, int i, int l, int r,  double k) {if (l <= x && y <= r) {a[i].sum2 += 2 * a[i].sum * k + (y - x + 1) * pow(k, 2);a[i].sum += k * (y - x + 1);a[i].lazy += k;return;}int mid = (x + y) / 2;if (a[i].lazy != 0) {a[i * 2].sum2 += 2 * a[i * 2].sum * a[i].lazy + (mid - x + 1) * pow(a[i].lazy, 2);a[i * 2].sum += a[i].lazy * (mid - x + 1);a[i * 2].lazy += a[i].lazy;a[i * 2 + 1].sum2 += 2 * a[i * 2 + 1].sum * a[i].lazy + (y - mid) * pow(a[i].lazy, 2);a[i * 2 + 1].sum += a[i].lazy * (y - mid);a[i * 2 + 1].lazy += a[i].lazy;a[i].lazy = 0;}if (mid >= l) {Xiu(x, mid, i * 2, l, r, k);}if (mid + 1 <= r) {Xiu(mid + 1, y, i * 2 + 1, l, r, k);}a[i].sum2 = a[i * 2].sum2 + a[i * 2 + 1].sum2;a[i].sum = a[i * 2].sum + a[i * 2 + 1].sum;
}
double Chasum(int x, int y, int i, int l, int r) {if (l <= x && y <= r) {return a[i].sum;}int mid = (x + y) / 2;if (a[i].lazy != 0) {a[i * 2].sum2 += 2 * a[i * 2].sum * a[i].lazy + (mid - x + 1) * pow(a[i].lazy, 2);a[i * 2].sum += a[i].lazy * (mid - x + 1);a[i * 2].lazy += a[i].lazy;a[i * 2+1].sum2 += 2 * a[i * 2+1].sum * a[i].lazy + (y-mid) * pow(a[i].lazy, 2);a[i * 2 + 1].sum += a[i].lazy * (y - mid);a[i * 2 + 1].lazy += a[i].lazy;a[i].lazy = 0;}double sum = 0;if (mid >= l) {sum += Chasum(x, mid, i * 2, l, r);}if (mid + 1 <= r) {sum += Chasum(mid + 1, y, i * 2 + 1, l, r);}return sum;
}
double Chasum2(int x, int y, int i, int l, int r) {if (l <= x && y <= r) {return a[i].sum2;}int mid = (x + y) / 2;if (a[i].lazy != 0) {a[i * 2].sum2 += 2 * a[i * 2].sum * a[i].lazy + (mid - x + 1) * pow(a[i].lazy, 2);a[i * 2].sum += a[i].lazy * (mid - x + 1);a[i * 2].lazy += a[i].lazy;a[i * 2 + 1].sum2 += 2 * a[i * 2 + 1].sum * a[i].lazy + (y - mid) * pow(a[i].lazy, 2);a[i * 2 + 1].sum += a[i].lazy * (y - mid);a[i * 2 + 1].lazy += a[i].lazy;a[i].lazy = 0;}double sum = 0;if (mid >= l) {sum += Chasum2(x, mid, i * 2, l, r);}if (mid + 1 <= r) {sum += Chasum2(mid + 1, y, i * 2 + 1, l, r);}return sum;
}
int main() {int l, r, h;double k;cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> b[i];}Chu(1, n, 1);for (int i = 1; i <= m; i++) {cin >> h;if (h == 1) {cin >> l >> r >> k;Xiu(1, n, 1, l, r, k);}else if(h==2){cin >> l >> r;cout <<fixed<<setprecision(4)<< Chasum(1, n, 1, l, r)/(double)(r-l+1) << endl;}else {cin >> l >> r;double average = Chasum(1, n, 1, l, r) / (double)(r - l + 1);double sum = Chasum2(1, n, 1, l, r) / (double)(r - l + 1) - pow(average, 2);cout << fixed << setprecision(4) << sum << endl;}}return 0;
}

相关文章:

  • 湖北理元理律师事务所:债务优化中如何保障债务人生存权益
  • 安装 WSL2 与设置​
  • 基于MSE-Nacos实现服务的动态发现和配置动态管理
  • mac如何使用tensorboardx?
  • Hive集成Paimon
  • 【Erdas实验教程】022:遥感图像辐射增强(直方图均衡化)
  • 【性能调优系列】如何分析火焰图
  • 计算机操作系统(计算题公式)
  • React组件通信——props
  • MyBatisPlus 全面学习路径
  • 【AI学习】【Ubuntu 22.04】【安装Ollama】两种方式
  • Spring-ai 1.0.0 学习(三)——流式调用及模型参数
  • JavaScript学习笔记
  • React-router实现原理剖析
  • OC-UI学习-Auto Layout使用
  • Hierarchical Vector Quantization for Unsupervised Action Segmentation
  • 如何实现自动标注
  • 文本预测和分类任务
  • 语言模型的泛化能力和训练数据依赖性
  • 【项目实训】【项目博客#09】HarmonySmartCodingSystem系统后端智能API检索与代码助手实现(6.2-6.15)
  • 怎么查看网站的备案号/今日热搜榜排名
  • 做网站 做什么网站好/鸣蝉智能建站
  • 做模型挣钱的网站/网推平台有哪些比较好
  • 营销型网站建设 案例/网站模板哪家好
  • 功能类网站/中国推广网
  • 做动态头像的网站/营业推广方式