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

2024 Jiangsu Collegiate Programming Contest E. Divide 题解 主席树

Divide

题目描述

Given an integer sequence a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,,an of length n n n. For an interval a l , … , a r a_l,\ldots,a_r al,,ar in this sequence, a Reduce operation divides the maximum value of the interval by 2 2 2 (rounding down). If there are multiple maximum values, choose the one with the smallest index. There are q q q queries. Given three integers l , r , k l,r,k l,r,k each time, query the maximum value of the interval after performing k k k Reduce operations on the a l , … , a r a_l,\ldots,a_r al,,ar interval. The queries are independent of each other. That is to say, each time the query starts from the initially given sequence.

输入描述

The two integers n , q n,q n,q ( 1 ≤ n , q ≤ 1 0 5 1\le n,q\le 10^5 1n,q105) in the first line represent the sequence length and the number of queries.

The second line contains n n n integers a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,,an ( 0 ≤ a i ≤ 1 0 5 0\le a_i\le 10^5 0ai105).

The next q q q lines each have three integers l , r , k l,r,k l,r,k ( 1 ≤ l ≤ r ≤ n , 0 ≤ k ≤ 1 0 9 1\le l\le r\le n,0\le k\le 10^9 1lrn,0k109), representing a query.

输出描述

For each query, output an integer in one line, representing the maximum value of the interval since the operation started from the initial sequence.

样例 #1

样例输入 #1

3 2
2 0 2
2 3 0
1 3 0

样例输出 #1

2
2

样例 #2

样例输入 #2

6 6
9 5 0 3 6 7
1 4 7
3 3 233
6 6 0
3 4 4
4 5 15
1 1 0

样例输出 #2

1
0
7
0
0
9

思路

将题目所给数组进行扩充。例如,对于样例#2,数组 9 5 0 3 6 7 可通过对每个数不断除以 2 2 2 直至为 0 0 0 ( 0 0 0也加入扩充后数组) 扩充为 9 4 2 1 0 5 2 1 0 0 3 1 0 6 3 1 0 7 3 1 0。这样,对于每个询问,相当于在扩充后的数组中寻找第 k + 1 k+1 k+1 大值。但由于询问中的区间是原数组中的区间,所以我们需利用 map 构建原数组区间到扩充后数组区间的映射。此外,对于询问中 k + 1 k+1 k+1 的值大于扩充后区间中元素个数的情况,需要特判答案为 0 0 0

代码

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
typedef long long ll;const int maxn = 2e6;int tot, n, m;
int sum[(maxn << 5) + 10], rt[maxn + 10], ls[(maxn << 5) + 10], rs[(maxn << 5) + 10];
int a[maxn + 10], ind[maxn + 10], len;int getid(const int &val)
{return lower_bound(ind + 1, ind + len + 1, val) - ind;
}int build(int l, int r)
{int root = ++tot;if (l == r){return root;}int mid = l + r >> 1;ls[root] = build(l, mid);rs[root] = build(mid + 1, r);return root;
}int update(int k, int l, int r, int root)
{int dir = ++tot;ls[dir] = ls[root], rs[dir] = rs[root];sum[dir] = sum[root] + 1;if (l == r){return dir;}int mid = l + r >> 1;if (k <= mid){ls[dir] = update(k, l, mid, ls[dir]);}else{rs[dir] = update(k, mid + 1, r, rs[dir]);}return dir;
}int query(int u, int v, int l, int r, int k)
{int mid = l + r >> 1;int x = sum[ls[v]] - sum[ls[u]];if (l == r){return l;}if (k <= x){return query(ls[u], ls[v], l, mid, k);}else{return query(rs[u], rs[v], mid + 1, r, k - x);}
}map<int, pair<int, int>> mp; // 构建原来数组中下标到扩充后数组中下标的映射void init()
{cin >> n >> m;int idx = 0; // 扩充数组的索引int x;for (int i = 1; i <= n; i++){cin >> x;mp[i].first = idx + 1; // 一个原数组中的元素x经扩充后的区间的左端点while (x)              // 元素x扩充,扩充到区间[mp[i].first,mp[i].second]里面{a[++idx] = x;x /= 2;}a[++idx] = 0;       // ai可能等于0,所以要单独将0加入扩充后区间mp[i].second = idx; // 一个原数组中的元素x经扩充后的区间的右端点}// 离散化构建主席树,主席树可用来求出扩充后数组的区间第k小值memcpy(ind, a, sizeof(ind));sort(ind + 1, ind + idx + 1);len = unique(ind + 1, ind + idx + 1) - ind - 1;rt[0] = build(1, len);for (int i = 1; i <= idx; i++){rt[i] = update(getid(a[i]), 1, len, rt[i - 1]);}
}int l, r, k;void work()
{while (m--){cin >> l >> r >> k;k++; // 当k=i时,求的是第i+1大数,所以k需要++// 主席树询问区间:左开右闭int left = mp[l].first - 1;int right = mp[r].second;// 因为左开右闭,所以区间长度即为right-left,而当区间长度小于k+1时,第k+1大值一定为0if (right - left < k)cout << 0 << '\n';elsecout << ind[query(rt[left], rt[right], 1, len, right - left + 1 - k)] << '\n'; // right - left + 1 - k的运算是将求第k大值转化为求第right - left + 1 - k小值}
}int main()
{ios::sync_with_stdio(0);cin.tie(0);init();work();return 0;
}

相关文章:

2024 Jiangsu Collegiate Programming Contest E. Divide 题解 主席树

Divide 题目描述 Given an integer sequence a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1​,a2​,…,an​ of length n n n. For an interval a l , … , a r a_l,\ldots,a_r al​,…,ar​ in this sequence, a Reduce operation divides the maximum value of the inter…...

C# WPF入门学习主线篇(十五)—— DockPanel布局容器

C# WPF入门学习主线篇&#xff08;十五&#xff09;—— DockPanel布局容器 欢迎来到C# WPF入门学习系列的第十五篇。在前几篇文章中&#xff0c;我们探讨了 Canvas、StackPanel 和 WrapPanel 布局容器及其使用方法。本篇博客将介绍另一种强大且常用的布局容器——DockPanel。…...

基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真&#xff0c;包括电机&#xff0c;SVPWM模块&#xff0c;矢量控制器模块等。 2.系统仿真结果 3.核心程序与模…...

Linux操作系统:Zookeeper在虚拟环境下的安装与部署

将 Zookeeper 安装到指定目录 // 将zookeeper解压到安装目录 $ tar –zxvf zookeeper-3.4.10.tar.gz –C /usr/local $ mv /usr/local/zookeeper-3.4.10.tar.gz /usr/local/zookeeper 设置 zookeeper 配置文件 // 创建 data 数据目录 $ mkdir /usr/local/zookeeper/data // …...

决策树Decision Tree

目录 一、介绍发展优点缺点基本原理 二、熵1、熵2、条件熵3、信息增益4、信息增益率 三、基尼系数四、ID3算法1、建树过程2、优点3、缺点 五、C4.51、二分法处理连续变量1、流程&#xff1a;2、示例 2、缺点 六、CART1、连续数据处理2、离散数据处理3、CART回归原理1、均方误差…...

1奇函数偶函数

文章目录 自变量有理化奇偶性周期性初等函数 自变量 自变量是x&#xff0c;这个还挺奇怪&#xff0c;记住就好 y f ( e x 1 ) yf(e^x1) yf(ex1) 里面 e x e^x ex 只算中间变量&#xff0c;自变量是x 做这些题&#xff0c;想到了以前高中的时候做数学题&#xff0c;不够扎实…...

什么情况下需要配戴助听器

以下几种情况需要考虑配戴助听器&#xff1a; 1、听力无波动3个月以上的感音神经性听力障碍。如:先天性听力障碍、老年性听力障碍、噪声性听力障碍、突聋的稳定期等&#xff0c;均可选配合适的助听器。 2、年龄方面。使用助听器没有严格的年龄限制&#xff0c;从出生数周的婴…...

Java 基础面试300题 (231-260)

Java 基础面试300题 &#xff08;231-260&#xff09; 231 String::toUpperCase是什么类型的方法引用&#xff1f; String::toUpperCase是任意方法引用的示例。它指的是String 类的toUpperCase方法&#xff0c;但不是指任何特定对象。 通常在遍历集合或流时使用。例如&#x…...

Hadoop3:MapReduce源码解读之Map阶段的Job任务提交流程(1)

3、Job工作机制源码解读 用之前wordcount案例进行源码阅读&#xff0c;debug断点打在Job任务提交时 提交任务前&#xff0c;建立客户单连接 如下图&#xff0c;可以看出&#xff0c;只有两个客户端提供者&#xff0c;一个是YarnClient&#xff0c;一个是LocalClient。 显然&a…...

Linux环境---在线安装MYSQL数据库

Linux环境—在线安装MYSQL数据库 一、使用步骤 1.安装环境 Mysql 驱动 8.0 需要 jdk1.8 才行。 JDK版本&#xff1a;1.8 参考文档 MYSQL版本&#xff1a;8.0.2 下载链接: https://pan.baidu.com/s/1MwXIilSL6EY3OuS7WtpySA?pwdg263 操作系统&#xff1a;CentOS 1.1 建立存…...

git本地配置及IDEA下Git合并部分文件

目录 1、IDEA 下 Git 合并部分文件 2、分支合并忽略特定文件步骤 3、git本地配置 1、IDEA 下 Git 合并部分文件 1.1Git 下存在两个分支&#xff0c;foo 和 bar 分支&#xff0c;想要把 bar 分支上的部分文件合并到 foo 分支: 首先切换到 foo 分支&#xff0c;点击右下角的 …...

安徽京准 NTP时钟同步服务器具体配置方法是什么?

安徽京准 NTP时钟同步服务器具体配置方法是什么&#xff1f; 安徽京准 NTP时钟同步服务器具体配置方法是什么&#xff1f; 可以使用特权终结点 (PEP) 来更新 Azure Stack Hub 中的时间服务器。 使用可解析为两个或更多个 NTP&#xff08;网络时间协议&#xff09;服务器 IP 地…...

微信小程序 画布canvas

属性说明 属性类型默认值必填说明最低版本typestring否指定 canvas 类型&#xff0c;支持 2d (2.9.0) 和 webgl (2.7.0)2.7.0canvas-idstring否canvas 组件的唯一标识符&#xff0c;若指定了 type 则无需再指定该属性1.0.0disable-scrollbooleanfalse否当在 canvas 中移动时且…...

leetcode-04-[24]两两交换链表中的节点[19]删除链表的倒数第N个节点[160]相交链表[142]环形链表II

一、[24]两两交换链表中的节点 重点&#xff1a;暂存节点 class Solution {public ListNode swapPairs(ListNode head) {ListNode dummyHeadnew ListNode(-1);dummyHead.nexthead;ListNode predummyHead;//重点&#xff1a;存节点while(pre.next!null&&pre.next.next…...

深入探讨 Java 18 的主要新特性,分析其设计理念和实际应用

Java 18 作为 Java 的最新版本,引入了一系列的新特性和改进,这些变化不仅提升了语言的性能和安全性,也为开发者提供了更多的工具和选项,简化了开发过程,提高了代码的可读性和维护性。本文将深入探讨 Java 18 的主要新特性,分析其设计理念和实际应用,帮助读者理解这些新特…...

qt4-qt5 升级(2)-GUI-UTF-8-GBK-QTextCode-字符集乱码

MFC与QT的消息机制的区别_qt信号槽机制与mfc的消息映射机制的区别-CSDN博客 1.QT4-QT5差别 kits构建 控件&#xff0c;信号与槽 ui修改好后点击编译会自动生成 ui_XXX.h 聚合的关系&#xff0c;不是拥有的关系。 QWidget 和QWindow有什么差别&#xff1f; 2.VS2019-QT5 构建…...

Qt Designer 生成的 .ui 文件转为 .py 文件并运行

1. 使用使用 PyUIC将 .ui 转 .py &#xff08;1&#xff09;打开命令行终端&#xff08;可以用cmd&#xff0c;或pycharm 下面的 Terminal&#xff09;。 &#xff08;2&#xff09;导航到包含.ui文件的目录。 cd 你的ui文件路径 &#xff08;3&#xff09;运行以下命令来…...

Dubbo 3.x源码(20)—Dubbo服务引用源码(3)

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了调用createProxy方法&#xff0c;根据服务引用参数map创建服务接口代理引用对象的整体流程&#xff0c;我们知道会调用createInvokerForRemote方法创建远程引用Invoker&#xff0c;这是Dubbo …...

开发一个Dapp需要多少?

区块链开发一个Dapp要多少钱&#xff1f; 开发一个去中心化应用&#xff08;Dapp&#xff09;的成本取决于多个因素&#xff0c;包括Dapp的复杂性、功能需求、区块链平台以及开发团队的经验水平。以下是一些主要的影响因素&#xff1a; 1. 区块链平台&#xff1a;不同区块链…...

kNN算法-概述

所谓kNN算法就是K-nearest neigbor algorithm。这是似乎是最简单的监督机器学习算法。在训练阶段&#xff0c;kNN算法存储了标签训练样本数据。简单地说&#xff0c;就是调用训练方法时传递给它的标签训练样本会被它存储起来。 kNN算法也叫lazy learning algorithm懒惰学习算法…...

基于DDQN的柔性作业车间动态调度优化:多智能体协同与奖励机制设计

1. 柔性作业车间调度为什么需要深度强化学习&#xff1f; 想象一下你管理着一个汽车零部件加工厂&#xff0c;每天有上百个不同型号的零件需要经过车削、铣削、钻孔等多道工序。每台机器的加工能力不同&#xff0c;订单的紧急程度各异&#xff0c;还时不时有加急订单插队——这…...

数据结构优化李慕婉-仙逆-造相Z-Turbo性能实战

数据结构优化李慕婉-仙逆-造相Z-Turbo性能实战 文生图模型在实际应用中经常会遇到性能瓶颈&#xff0c;特别是在处理高分辨率图像生成时。本文将分享如何通过数据结构优化来显著提升李慕婉-仙逆-造相Z-Turbo模型的运行效率&#xff0c;让角色生成更快更流畅。 1. 理解性能瓶颈所…...

颠覆性语音交互:MiGPT零门槛打造专属AI语音助手全攻略

颠覆性语音交互&#xff1a;MiGPT零门槛打造专属AI语音助手全攻略 【免费下载链接】mi-gpt &#x1f3e0; 将小爱音箱接入 ChatGPT 和豆包&#xff0c;改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 你是否想过让家里的小爱音箱突…...

Meta-Llama-3-8B-Instruct零基础部署:5分钟用vLLM+Open WebUI搭建对话机器人

Meta-Llama-3-8B-Instruct零基础部署&#xff1a;5分钟用vLLMOpen WebUI搭建对话机器人 1. 准备工作&#xff1a;了解你的工具 Meta-Llama-3-8B-Instruct是Meta公司最新开源的80亿参数对话模型&#xff0c;相比前代产品&#xff0c;它在指令遵循、多轮对话和代码理解方面都有…...

【VSCode 2026 AI调试革命】:5大原生AI断点能力首次解禁,开发者必须抢占的调试范式升级窗口期

第一章&#xff1a;VSCode 2026 AI调试革命的范式跃迁传统调试依赖断点、变量监视与手动步进&#xff0c;而 VSCode 2026 将 AI 原生嵌入调试生命周期——不再是插件式辅助&#xff0c;而是内核级协同推理引擎。调试器在暂停时自动调用多模态上下文理解模型&#xff0c;实时解析…...

1C31166G02 模块广泛应用于化工制造石油等

1C31166G02 产品介绍1C31166G02 是艾默生&#xff08;Emerson&#xff09;Ovation 系列分布式控制系统&#xff08;DCS&#xff09;中的一款关键模块&#xff0c;具体为串行链路控制器模块。以下是对该产品的详细介绍&#xff1a;一、产品概述品牌与型号&#xff1a;艾默生&…...

brew安装skills报权限太高的解决办法

现象 在openclaw web-ui界面&#xff0c;安装需要通过brew方式安装的skills&#xff0c;安装失败&#xff1a;权限太高 Install failed (exit 1): Error: Running Homebrew as root is extremely dangerous and no longer supported.解决办法 1、openclaw 不要使用 root 用户安…...

计算机毕业设计之springboot基于宠物饲养管理APP的设计与实现

宠物饲养管理APP设计的目的是为用户提供宠物信息、年龄段、饮食信息、生活习惯等方面的平台。与PC端应用程序相比&#xff0c;宠物饲养管理APP的设计主要面向于宠物店&#xff0c;旨在为管理员和用户提供一个宠物饲养管理APP。用户可以通过APP及时查看宠物信息等。宠物饲养管理…...

数据即资产,安全即底线——企业资产数据安全控制管理的全维度实践与未来展望

在数字经济深度渗透的今天&#xff0c;数据已成为企业核心战略资产&#xff0c;是驱动业务创新、提升核心竞争力的关键引擎。从客户信息、财务数据到核心技术文档、商业秘密&#xff0c;数据的流转与应用贯穿企业运营全链条&#xff0c;但与此同时&#xff0c;数据泄露、篡改、…...

简单的c语言分析 汇编代码

1、STR是ARM汇编中的内存访问指令&#xff1a;表示字数据写入&#xff0c;用于将一个32位的字数据写入到指令中指定的内存单元。 比如STR R0, [R1, #0x100]; 表示将R0中的字数据保存到内存单元&#xff08;R10x100&#xff09;中。2、 BL 指令BL 指令的格式为&#xff1a; BL{条…...