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

P3707 [SDOI2017] 相关分析 Solution

Description

给定序列 x = ( x 1 , x 2 , ⋯ , x n ) , y = ( y 1 , y 2 , ⋯ , y n ) x=(x_1,x_2,\cdots,x_n),y=(y_1,y_2,\cdots,y_n) x=(x1,x2,,xn),y=(y1,y2,,yn),有 m m m 个操作,分三种:

  1. query ⁡ ( l , r ) \operatorname{query}(l,r) query(l,r):求 ∑ i = l r ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = l r ( x i − x ˉ ) 2 \dfrac{\sum_{i=l}^r (x_i-\bar x)(y_i-\bar y)}{\sum_{i=l}^r (x_i-\bar x)^2} i=lr(xixˉ)2i=lr(xixˉ)(yiyˉ),其中 x ˉ \bar x xˉ x l ⋯ r x_{l\cdots r} xlr 的平均值, y ˉ \bar y yˉ y l ⋯ r y_{l\cdots r} ylr 的平均值,保证分母不为 0 0 0
  2. add ⁡ ( l , r , s , t ) \operatorname{add}(l,r,s,t) add(l,r,s,t):对所有 i ∈ [ l , r ] i \in [l,r] i[l,r] 执行 x i ← x i + s , y i ← y i + t x_i \leftarrow \textcolor{red}{x_i} + s, \;y_i \leftarrow \textcolor{red}{y_i} + t xixi+s,yiyi+t.
  3. modify ⁡ ( l , r , s , t ) \operatorname{modify}(l,r,s,t) modify(l,r,s,t):对所有 i ∈ [ l , r ] i \in [l,r] i[l,r] 执行 x i ← i + s , y i ← i + t x_i \leftarrow \textcolor{red}{i} + s, \;y_i \leftarrow \textcolor{red}{i} + t xii+s,yii+t.

Limitations

1 ≤ n , m ≤ 1 0 5 1 \le n,m \le 10^5 1n,m105
∣ s ∣ , ∣ t ∣ ≤ 1 0 9 |s|,|t| \le 10^9 s,t109
0 ≤ ∣ x i ∣ , ∣ y i ∣ ≤ 1 0 5 0 \le |x_i|,|y_i| \le 10^5 0xi,yi105
1 s , 125 MB 1\text{s},125\text{MB} 1s,125MB

Solution

发现要求的式子难以维护,考虑化简,得到 ∑ x i y i − ∑ x i ∑ y i r − l + 1 ∑ x i 2 − ( ∑ x i ) 2 r − l + 1 \dfrac{\sum x_iy_i-\frac{\sum x_i \sum y_i}{r-l+1}}{\sum x_i^2 - \frac{(\sum x_i)^2}{r-l+1}} xi2rl+1(xi)2xiyirl+1xiyi(过程不好打所以省略)。
现在只需维护 ∑ x i , ∑ y i , ∑ x i 2 , ∑ x i y i \sum x_i,\;\sum y_i, \; \sum x_i^2,\; \sum x_iy_i xi,yi,xi2,xiyi,可以上线段树。
考虑 pushdown 如何写,发现后两个不好搞,同样化简式子:

  1. ∑ ( x i + s ) ( y i + t ) = ∑ x i y i + s ∑ y i + t ∑ x i + s t ( r − l + 1 ) \sum (x_i+s)(y_i+t)=\sum x_iy_i+s\sum y_i+t\sum x_i+st(r-l+1) (xi+s)(yi+t)=xiyi+syi+txi+st(rl+1)
  2. ∑ ( x i + s ) 2 = ∑ x i 2 + 2 s ∑ x i + s 2 ( r − l + 1 ) \sum (x_i+s)^2=\sum x^2_i+2s\sum x_i+s^2(r-l+1) (xi+s)2=xi2+2sxi+s2(rl+1)

然后写的时候注意顺序!!
还需要一个 x i ← i , y i ← i x_i \leftarrow i,y_i \leftarrow i xii,yii 的标记,写的时候需要用公式 1 2 + 2 2 + ⋯ + n 2 = n ( n + 1 ) ( 2 n + 1 ) 6 1^2+2^2+\cdots+n^2=\dfrac{n(n+1)(2n+1)}{6} 12+22++n2=6n(n+1)(2n+1)

剩下的不必多说,和普通的是一样的。
注意全部要开 double 因为可能爆 long long

Code

4.58 KB , 1.53 s , 26.24 MB (in total, C++ 20 with O2) 4.58\text{KB},1.53\text{s},26.24\text{MB} \; \texttt{(in total, C++ 20 with O2)} 4.58KB,1.53s,26.24MB(in total, C++ 20 with O2)

// Problem: P3707 [SDOI2017] 相关分析
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3707
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;using i64 = long long;
using ui64 = unsigned long long;
using i128 = __int128;
using ui128 = unsigned __int128;
using f4 = float;
using f8 = double;
using f16 = long double;template<class T>
bool chmax(T &a, const T &b){if(a < b){ a = b; return true; }return false;
}template<class T>
bool chmin(T &a, const T &b){if(a > b){ a = b; return true; }return false;
}struct Node {int l, r;f8 sumX, sumY, sumXX, sumXY, tagX, tagY;bool cover;
};using Tree = vector<Node>;
int ls(int u) { return 2 * u + 1; }
int rs(int u) { return 2 * u + 2; }void merge(Node& res, const Node& le, const Node& ri) {res.sumX = le.sumX + ri.sumX;res.sumY = le.sumY + ri.sumY;res.sumXX = le.sumXX + ri.sumXX;res.sumXY = le.sumXY + ri.sumXY;
}void pushup(Tree& tr, int u) {merge(tr[u], tr[ls(u)], tr[rs(u)]);
}void build(Tree& tr, int u, int l, int r, vector<f8>& X, vector<f8>& Y) {tr[u].l = l;tr[u].r = r;if (l == r) {tr[u].sumX = X[l];tr[u].sumY = Y[l];tr[u].sumXX = X[l] * X[l];tr[u].sumXY = X[l] * Y[l];return;}int mid = (l + r) >> 1;build(tr, ls(u), l, mid, X, Y);build(tr, rs(u), mid + 1, r, X, Y);pushup(tr, u);
}f8 sqsum(f8 a) {return a * (a + 1) * (2 * a + 1) / 6;
}void fix(Tree& tr, int u) {f8 lef = tr[u].l, rig = tr[u].r;tr[u].tagX = tr[u].tagY = 0;tr[u].cover = true;tr[u].sumX = tr[u].sumY = (lef + rig + 2) * (rig - lef + 1) / 2;tr[u].sumXX = tr[u].sumXY = sqsum(rig + 1) - sqsum(lef);
}void apply(Tree& tr, int u, f8 tagX, f8 tagY) {int len = tr[u].r - tr[u].l + 1;tr[u].tagX += tagX;tr[u].tagY += tagY;tr[u].sumXY += tagY * tr[u].sumX + tagX * tr[u].sumY + tagX * tagY * len;tr[u].sumXX += 2 * tagX * tr[u].sumX + tagX * tagX * len;tr[u].sumX += tagX * len;tr[u].sumY += tagY * len;
}void pushdown(Tree& tr, int u) {if (tr[u].cover) {fix(tr, ls(u));fix(tr, rs(u));tr[u].cover = false;}apply(tr, ls(u), tr[u].tagX, tr[u].tagY);apply(tr, rs(u), tr[u].tagX, tr[u].tagY);tr[u].tagX = tr[u].tagY = 0;
}void add(Tree& tr, int u, int l, int r, f8 X, f8 Y) {if (l <= tr[u].l && tr[u].r <= r) {apply(tr, u, X, Y);return;}int mid = (tr[u].l + tr[u].r) >> 1;pushdown(tr, u);if (l <= mid) {add(tr, ls(u), l, r, X, Y);}if (r > mid) {add(tr, rs(u), l, r, X, Y);}pushup(tr, u);
}void update(Tree& tr, int u, int l, int r, f8 X, f8 Y) {if (l <= tr[u].l && tr[u].r <= r) {fix(tr, u);apply(tr, u, X, Y);return;}int mid = (tr[u].l + tr[u].r) >> 1;pushdown(tr, u);if (l <= mid) {update(tr, ls(u), l, r, X, Y);}if (r > mid) {update(tr, rs(u), l, r, X, Y);}pushup(tr, u);
}Node query(Tree& tr, int u, int l, int r) {if (l <= tr[u].l && tr[u].r <= r) {return tr[u];}int mid = (tr[u].l + tr[u].r) >> 1;pushdown(tr, u);if (r <= mid) {return query(tr, ls(u), l, r);}if (l > mid) {return query(tr, rs(u), l, r);}Node res;Node le = query(tr, ls(u), l, r);Node ri = query(tr, rs(u), l, r);merge(res, le, ri);return res;
}signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, m;cin >> n >> m;vector<f8> X(n), Y(n);for (int i = 0; i < n; i++) {cin >> X[i];}for (int i = 0; i < n; i++) {cin >> Y[i];}Tree seg(n << 2);build(seg, 0, 0, n - 1, X, Y);auto get = [&](int l, int r) {Node res = query(seg, 0, l, r);int len = r - l + 1;f8 num = res.sumXY - res.sumX * res.sumY / len;f8 den = res.sumXX - res.sumX * res.sumX / len;return num / den;};for (int i = 0; i < m; i++) {int op, l, r;cin >> op >> l >> r;l--, r--;if (op == 1) {printf("%.10lf\n", get(l, r));}else if (op == 2) {f8 s, t;cin >> s >> t;add(seg, 0, l, r, s, t);}else {f8 s, t;cin >> s >> t;update(seg, 0, l, r, s, t);}};return 0;
}

相关文章:

P3707 [SDOI2017] 相关分析 Solution

Description 给定序列 x ( x 1 , x 2 , ⋯ , x n ) , y ( y 1 , y 2 , ⋯ , y n ) x(x_1,x_2,\cdots,x_n),y(y_1,y_2,\cdots,y_n) x(x1​,x2​,⋯,xn​),y(y1​,y2​,⋯,yn​)&#xff0c;有 m m m 个操作&#xff0c;分三种&#xff1a; query ⁡ ( l , r ) \operatornam…...

Android AutoMotive --CarService

1、AAOS概述 Android AutoMotive OS是谷歌针对车机使用场景打造的操作系统&#xff0c;它是基于现有Android系统的基础上增加了新特性&#xff0c;最主要的就是增加了CarService&#xff08;汽车服务&#xff09;模块。我们很容易把Android AutoMotive和Android Auto搞混&…...

K8S中Service详解(三)

HeadLiness类型的Service 在某些场景中&#xff0c;开发人员可能不想使用Service提供的负载均衡功能&#xff0c;而希望自己来控制负载均衡策略&#xff0c;针对这种情况&#xff0c;kubernetes提供了HeadLiness Service&#xff0c;这类Service不会分配Cluster IP&#xff0c;…...

C++----STL(vector)

vector的介绍 vector的文档介绍&#xff1a;cplusplus.com/reference/vector/vector/ 1.基本概念 简单来说&#xff0c;vector是表示可以改变大小的数组的顺序容器。使用连续的存储位置来存储元素&#xff0c;因此可以通过常规指针的偏移量来高效访问。 2.内部机制 vector…...

Ubuntu24.04初始化MySQL报错 error while loading shared libraries libaio.so.1

Ubuntu24.04初始化MySQL报错 error while loading shared libraries: libaio.so.1 问题一&#xff1a;libaio1不存在 # 提示libaio1不存在 [rootzabbix-mysql-master.example.com x86_64-linux-gnu]#apt install numactl libaio1 Reading package lists... Done Building depe…...

初探大数据流式处理

文章目录 初探大数据流式处理批式处理系统特点流式处理系统特点大批次计算微批次计算适用场景 流式计算的应用场景流式大数据的特征流式计算的关键技术流式处理框架的特征三大流式数据处理框架 初探大数据流式处理 大数据处理系统主要分为批式处理和流式处理两类。批式处理将大…...

【Linux】Linux入门(三)权限

目录 前提权限概念whoami指令 Linux权限管理文件访问者的分类&#xff08;人&#xff09;file指令权限信息权限的表示方法 chmod指令 更改权限chown指令 修改文件&#xff0c;文件夹所属用户和用户组 权限掩码umask&#xff08;权限掩码&#xff09; 粘滞位 前提 请先看下面这…...

html,css,js的粒子效果

这段代码实现了一个基于HTML5 Canvas的高级粒子效果&#xff0c;用户可以通过鼠标与粒子进行交互。下面是对代码的详细解析&#xff1a; HTML部分 使用<!DOCTYPE html>声明文档类型。<html>标签内包含了整个网页的内容。<head>部分定义了网页的标题&#x…...

Spring Boot + Netty + WebSocket 实现消息推送

1、关于Netty Netty 是一个利用 Java 的高级网络的能力&#xff0c;隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 2、Maven依赖 <dependencies><!-- https://mvnrepository.com/artifact/io.netty/netty-all --><dependency><gr…...

Python3 【字符串】:方法和函数使用示例手册

Python3 【字符串】&#xff1a;方法和函数使用示例手册 Python 提供了丰富的字符串处理方法和函数&#xff0c;以下是一些常用的方法和函数分类整理&#xff0c;并提供详细使用示例&#xff0c;简单易懂&#xff0c;值得收藏。 1. 字符串大小写转换 str.upper()&#xff1a;…...

数据结构与算法整理复习(一):数据结构概念与线性表

目录 第一章&#xff1a;绪论 1.1 数据结构的基本概念 1.2 算法与算法评价 第二章&#xff1a;线性表 2.1 线性表的定义和基本操作 2.2 线性表的顺序表示&#xff08;顺序表&#xff09; 应用题 2.3 线性表的链式表达&#xff08;链表&#xff09; 2.3.1 单链表 2.3.2…...

【Block总结】PConv风车卷积,更大的感受野,提高特征提取能力|即插即用

论文信息 论文标题&#xff1a;《Pinwheel-shaped Convolution and Scale-based Dynamic Loss for Infrared Small Target Detection》 论文链接&#xff1a;https://arxiv.org/pdf/2412.16986 GitHub链接&#xff1a;https://github.com/JN-Yang/PConv-SDloss-Data 创新点 …...

Python新春烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…...

VirtualBox can‘t enable the AMD-V extension

个人博客地址&#xff1a;VirtualBox cant enable the AMD-V extension | 一张假钞的真实世界 最近一次完成Deepin的系统更新后&#xff0c;进入VirtualBox创建的虚拟机&#xff08;Widows10&#xff09;时&#xff0c;出现以下错误&#xff1a; 根据网址“https://askubuntu.…...

掘金--创意标题匹配问题

问题描述 在广告平台中&#xff0c;为了给广告主一定的自由性和效率&#xff0c;允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候&#xff0c;会根据用户的搜索词触发的 bidword 对创意中的通配符&#xff08;通配符是用成对 {} 括起来的字符串&#x…...

OBU和T-Box

OBU&#xff08;On-Board Unit&#xff0c;车载单元&#xff09;和T-Box&#xff08;Telematics Box&#xff0c;远程信息处理控制单元&#xff09;都是用于车联网和智能交通系统的车载设备&#xff0c;但它们的功能、应用场景和技术特点存在显著差异。以下是两者的详细对比&am…...

【PVE】Proxmox VE8.0+创建LXC容器安装docker

为了不影响PVE宿主机&#xff0c;通常使用套娃的形式安装Docker容器&#xff0c;再安装相关docker应用。首先在CT模板中创建 Linux 容器&#xff0c;推荐使用Debian。开启ssh登录&#xff0c;修改debian配置&#xff0c;安装docker 一、创建 LXC 容器 1、CT模板下载 点击“模…...

一文大白话讲清楚webpack基本使用——11——chunkIds和runtimeChunk

文章目录 一文大白话讲清楚webpack基本使用——11——chunkIds和runtimeChunk1. 建议按文章顺序从头看&#xff0c;一看到底&#xff0c;豁然开朗2. 啥是chunkIds3.怎么使用chunkIds4. 啥是runtimeChunk5. 怎么使用runtimeChunk 一文大白话讲清楚webpack基本使用——11——chun…...

Java 中的设计模式:经典与现代实践

Java 中的设计模式&#xff1a;经典与现代实践 1. 设计模式简介 设计模式是一种软件开发中的思想&#xff0c;它为我们提供了一些经过验证的、能够应对常见问题的解决方案。学习和掌握设计模式能够让开发者在面对复杂的需求时&#xff0c;能够设计出更加灵活、可维护的代码。…...

DRG_DIP 2.0时代医院程序结构转型与数据结构优化研究

一、引言 1.1 DRG_DIP 2.0 改革背景与意义 医保支付方式改革在医疗保障制度改革中占据着极为关键的地位&#xff0c;是推动医疗领域变革的核心力量。它犹如一把精准的手术刀&#xff0c;对医疗资源的合理分配、医疗服务质量的稳步提升以及医疗费用的有效控制起着决定性作用。…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...