离散化和树状数组

离散化

                                  

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=3e5+9;
ll a[N];
struct Q
{ll a,b;
}Add[N],Que[N];//用结构体存储数值对
vector<ll>X;
ll getIdx(ll x)//得到离散化数组下标
{return lower_bound(X.begin(),X.end(),x)-X.begin()+1;//二分找到x的下标+1使它的下标从1开始,便于后边的计算
}
int main()
{ll n,q;cin>>n>>q;for(int i=1;i<=n;i++){ll x,w;cin>>x>>w;X.push_back(x);Add[i]={x,w};}for(int i=1;i<=q;i++){ll l,r;cin>>l>>r;X.push_back(l);X.push_back(r);Que[i]={l,r};}//排序去重sort(X.begin(),X.end());X.erase(unique(X.begin(),X.end()),X.end());for(int i=1;i<=n;i++){ll x=getIdx(Add[i].a);ll w=Add[i].b;a[x]+=w;}for(int i=1;i<=X.size();i++)a[i]+=a[i-1];//计算离散化数组的前缀和for(int i=1;i<=q;i++)//q次查询{ll l=getIdx(Que[i].a);ll r=getIdx(Que[i].b);cout<<a[r]-a[l-1]<<'\n';}return 0;
}

树状数组

单点修改

                         

#include<bits/stdc++.h>
using namespace std;
using ll=long long ;
const int N=2e5+9;
ll a[N],t[N];
ll n,q;
int lowbit(int x)//函数用于计算一个整数 x 的二进制表示中最低位的 1 所对应的值。例如,对于 x = 6(二进制表示为 110),lowbit(6) 的结果为 2(二进制表示为 10)
{return x & -x;
}
void update(int k,ll v)//函数用于将第 k 个元素的值增加 v。通过不断更新包含第 k 个元素的树状数组节点,保证树状数组的正确性
{for(int i=k;i<=n;i+=lowbit(i))t[i]+=v;
}
ll getsum(int k)//函数用于计算前 k 个元素的和。通过不断累加包含前 k 个元素的树状数组节点的值,得到最终的和
{ll res=0;for(int i=k;i>0;i-=lowbit(i))res+=t[i];return res;
}
int main()
{cin>>n>>q;for(int i=1;i<=n;i++)cin>>a[i];//构造树状数组for(int i=1;i<=n;i++)update(i,a[i]);while(q--){int op;cin>>op;if(op==1){int k;cin>>k;ll v;cin>>v;update(k,v);}if(op==2){int l,r;cin>>l>>r;cout<<getsum(r)-getsum(l-1)<<'\n';}}return 0;
}

区间修改

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=3e5+9;
ll a[N],td[N],tid[N];
ll n,q;
int lowbit(int x)
{return x&-x;
}
void update(int k,ll v)
//update 函数用于更新树状数组。当对数组中某个位置 k 进行修改时,需要更新 td 和 tid 两个树状数组。具体来说,td[i] 记录的是差分数组在对应位置的累加和,tid[i] 记录的是差分数组乘以位置的累加和。通过不断更新包含位置 k 的树状数组节点,保证树状数组的正确性
{for(int i=k;i<=n;i+=lowbit(i))td[i]+=v,tid[i]+=k*v;
}
ll getsum(int k)
//getsum 函数用于计算前缀和。通过累加包含前 k 个元素的树状数组节点的值,得到最终的前缀和。这里的公式 (k + 1) * td[i] - tid[i] 是根据差分数组的性质推导出来的,用于将差分数组转换为原数组的前缀和。
{ll ans=0;for(int i=k;i>0;i-=lowbit(i))ans+=(k+1)*td[i]-tid[i];return ans;
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n>>q;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++)update(i,a[i]),update(i+1,-a[i]);while(q--){int op;cin>>op;if(op==1){ll l,r,v;cin>>l>>r>>v;update(l,v),update(r+1,-v);}else{ll l,r;cin>>l>>r;cout<<getsum(r)-getsum(l-1)<<'\n';}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31640.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

序列化和反序列化(Linux)

1 序列化和反序列化 write和read实质是拷贝函数 1.1序列化和反序列化的概述&#xff1a; 2网络版计算器 2.1代码实现 先把日志拷贝过来 2.1.1必须先要有网络功能 先把 TcpServer.hpp编写号 #pragma once #include <cstdint>#include "Socket.hpp" #inclu…

关于ngx-datatable no data empty message自定义模板解决方案

背景&#xff1a;由于ngx-dataable插件默认没有数据时显示的文案是no data to display&#xff0c;且没有任何样式。这里希望通过自定义模板来实现。但目前github中有一个案例是通过设置代码&#xff1a; https://swimlane.github.io/ngx-datatable/empty** <ngx-datatable…

opencv 图片颜色+轮廓识别

目标图片&#xff1a; 1 简单识别图片中出现颜色最多的 import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException;public class SimpleImageColorRecognizer implements ImageColorRecogniz…

文件系统调用(上) ─── linux第17课

目录 linux 中man 2和man 3的区别 文件内容介绍 C语言文件接口 示例: 输出信息到显示器&#xff0c;你有哪些方法 总结: 系统文件I/O 文件类的系统调用接口介绍 示例 open 函数具体使用哪个,和具体应用场景相关&#xff0c; write read close lseek ,类比C文件相关接…

vue3-element-admin 前后端本地启动联调

一、后端环境准备 1.1、下载地址 gitee 下载地址 1.2、环境要求 JDK 17 1.3、项目启动 克隆项目 git clone https://gitee.com/youlaiorg/youlai-boot.git数据库初始化 执行 youlai_boot.sql 脚本完成数据库创建、表结构和基础数据的初始化。 修改配置 application-dev.y…

证券行业SCA开源风险治理实践

近日&#xff0c;悬镜安全成功中标国内领先的证券公司海通证券软件成分分析工具采购项目&#xff0c;中标产品为源鉴SCA开源威胁管控平台。 海通证券作为国内领先的证券公司之一&#xff0c;当下已基本建成涵盖证券期货经纪、投行、自营、资产管理、私募股权投资、另类投资、融…

JVM内存结构笔记(上)

文章目录 前言运行时数据区域1.程序计数器定义特点总结 2.虚拟机栈2.1 定义局部变量表 ★操作数栈动态链接方法返回地址(方法出口) 2.2 栈内存溢出演示栈内存溢出 java.lang.StackOverflowError 2.3问题辨析1. 垃圾回收是否涉及栈内存&#xff1f;2. 栈内存分配越大越好吗&…

使用 Miniforge3 管理 Python 环境的详细指南(基于最新实践和时效性信息,截至 2025 年)

以下是使用 Miniforge3 管理 Python 环境的详细指南&#xff08;基于最新实践和时效性信息&#xff0c;截至 2025 年&#xff09;&#xff1a; 一、Miniforge3 简介 Miniforge3 是一个轻量级 Conda 环境管理工具&#xff0c;默认使用 conda-forge 软件源&#xff08;社区维护的…

【python|二分|leetcode441】一题搞清楚二分区间问题---闭区间、左闭右开、左开右闭、全开区间

every blog every motto: Although the world is full of suffering&#xff0c; it is full also of the overcoming of it 0. 前言 一题搞清楚二分区间问题—闭区间、左闭右开、左开右闭、全开区间 0.1 题目&#xff1a;Problem: 441. 排列硬币 你总共有 n 枚硬币&#x…

【NLP 34、实践 ⑧ 基于faq知识库和文本匹配算法进行意图识别】

目录 一、demo1_similarity_function.py 二、demo2_bm25.py 三、基于faq知识库和文本匹配算法的意图识别 1.初始化 2.加载BM25模型 3.加载Word2Vec模型 4.文本向量化 5.加载知识库 6.查询方法 7.模型测试 正是江南好时节&#xff0c;落花时节又逢君 —— 25.3.7 一、demo1_sim…

机器人交互系统 部署构建

环境要求 Ubuntu 20.04 或更高版本ROS Noetic 或兼容版本Python 3.8 安装步骤 1. 安装ROS环境&#xff08;如未安装&#xff09; sudo apt update sudo apt install ros-noetic-desktop-full source /opt/ros/noetic/setup.bash2. 创建工作空间并克隆代码 mkdir -p ~/code…

每日一题——两数相加

两数相加 问题描述问题分析解题思路代码实现代码解析注意事项示例运行总结 问题描述 给定两个非空链表&#xff0c;表示两个非负整数。链表中的每个节点存储一个数字&#xff0c;数字的存储顺序为逆序&#xff08;即个位在链表头部&#xff09;。要求将这两个数字相加&#xff…

ResNet50深度解析:原理、结构与PyTorch实现

ResNet50深度解析&#xff1a;原理、结构与PyTorch实现 1. 引言 ResNet&#xff08;残差网络&#xff09;是深度学习领域的一项重大突破&#xff0c;它巧妙解决了深层神经网络训练中的梯度消失/爆炸问题&#xff0c;使得构建和训练更深的网络成为可能。作为计算机视觉领域的里…

政安晨【零基础玩转各类开源AI项目】Wan 2.1 本地部署,基于ComfyUI运行,最强文生视频 图生视频,一键生成高质量影片

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 下载项目 创建虚拟环境 安装项目依赖 尝试运行 依次下载模型 完成 我们今天要使…

每日一题----------String 和StringBuffer和StringBuiler重点

本质&#xff1a;是一个char字符数组存储字符串 总结&#xff1a; 1.如果字符串存在大量的修改操作&#xff0c;一般使用StringBuffer或者StringBuilder。 2.如果字符串存在大量的修改操作&#xff0c;并且单线程的情况&#xff0c;使用StringBuilder。 3.如果字符串存在大…

35.HarmonyOS NEXT Layout布局组件系统详解(二):AutoRow行组件实现原理

HarmonyOS NEXT Layout布局组件系统详解&#xff08;二&#xff09;&#xff1a;AutoRow行组件实现原理 文章目录 HarmonyOS NEXT Layout布局组件系统详解&#xff08;二&#xff09;&#xff1a;AutoRow行组件实现原理1. AutoRow组件概述2. AutoRow组件接口定义3. AutoRow组件…

Java 集合框架大师课:集合框架源码解剖室(五)

&#x1f525;Java 集合框架大师课&#xff1a;集合框架源码解剖室&#xff08;五&#xff09; &#x1f4a3; 警告&#xff1a;本章包含大量 裸码级硬核分析&#xff0c;建议搭配咖啡因饮料阅读&#xff01;☕️ 第一章 ArrayList 的扩容玄学 1.1 动态扩容核心代码大卸八块 …

Kubernetes服务部署 —— Kafka

1、简介 Kafka和zookeeper是两种典型的有状态的应用集群服务。首先kafka和zookeeper都需要存储盘来保存有状态信息&#xff1b;其次kafka和zookeeper每一个实例都需要有对应的实例Id (Kafka需broker.id, zookeeper需要my.id) 来作为集群内部每个成员的标识&#xff0c;集群内节…

计算机网络基础知识

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

电脑的写字板如何使用?

打开写字板&#xff1a; 直接按一下键盘上的win R 键&#xff0c;然后输入&#xff1a;write &#xff0c; 再按一下回车 , 即可打开写字板 可以在里面写文字 和 插入图片等… &#xff0c; 如下所示&#xff1a; 保存写字板内容&#xff1a; 当我们写好了之后&#xff0c;…