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

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;
}

http://www.xdnf.cn/news/14399.html

相关文章:

  • 【项目实训】【项目博客#06】大模型微调与推理优化(4.21-5.11)
  • Velocity提取模板变量
  • 项目三 - 任务7:开发名片管理系统
  • SCAU大数据技术原理期末复习|第10、11章
  • ansible模块使用实践
  • UnityDots学习(六)
  • 手动 + 自动双方案组合:Innocise 壁虎吸盘灵活适配多场景无损搬运需求
  • 谷歌浏览器编译windows版本
  • Vue3相关知识1
  • STM32 HAL库学习 RNG篇
  • 编译链接实战(32)动态库的本质和原理
  • 循环神经网络及其变体
  • 数据库核心技术深度剖析:事务、索引、锁与SQL优化实战指南(第六节)-----InnoDB引擎
  • 软件设计模式入门
  • 力扣Hot100每日N题(17~18)
  • Vue学习001-创建 Vue 应用
  • anaconda安装教程
  • 板凳-------Mysql cookbook学习 (十--7)
  • 使用pinia代替vuex处理登录流程
  • 什么是扩展运算符?有什么使用场景?
  • 强化学习怎么入门?
  • Vue3 跨多个组件方法调用:简洁实用的解决方案
  • 人工智能基础知识笔记十:降维技术
  • cache的学习
  • 扣子开发平台 Agent 开发教程(一)
  • Adoquery 转AdoDataSet
  • LeetCode 1385.两个数组间的距离值
  • Kafka 可靠性保障:消息确认与事务机制(一)
  • vue3 +spring boot文件上传
  • 【Go语言-Day 1】扬帆起航:从零到一,精通 Go 语言环境搭建与首个程序