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

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

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

相关文章

【NI国产替代】产线测试:数字万用表(DMM),功率分析仪,支持定制

数字万用表&#xff08;DMM&#xff09; • 6 位数字表显示 • 24 位分辨率 • 5S/s-250KS/s 采样率 • 电源和数字 I/O 均采用隔离抗噪技术 • 电压、电流、电阻、电感、电容的高精度测量 • 二极管/三极管测试 功率分析仪 0.8V-14V 的可调输出电压&#xff0c;最大连…

[Cloud Networking] Layer Protocol (continue)

文章目录 1. STP / RSTP / MSTP Protocol1.1 STP的作用1.2 STP 生成树算法的三个步骤1.3 STP缺点 2. ARP Protocol3. DHCP Protocol3.1 DHCP 三种分配方式3.2 DHCP 攻击 4. IPSEC / MACSEC 1. STP / RSTP / MSTP Protocol 1.1 STP的作用 消除二层环路&#xff1a;通过阻断冗余…

shell脚本基础教程

快捷目录 1、解释器2、shell脚本调用方式3、变量自定义变量环境变量特殊变量变量的默认值declare 命令readonly命令let命令 4、数据类型字符串 5、字符串操作6、数组定义数组读取数组修改数组删除数组获取数组长度 7、运算符算术运算符关系运算符布尔运算符逻辑运算符 要在[[ ]…

求极差(range)

题目描述 小红拿到了一个数组&#xff0c;其中每个元素都是素数。小红准备进行若干次以下操作&#xff1a; 选择两个素数元素&#xff0c;将他们合并&#xff0c;生成的新元素为原来两个素数的乘积。 现在小红希望操作到不能再操作为止&#xff0c;然后使得最终的极差&#…

王道408数据结构CH4_串

概述 4 串 4.1 串的实现 4.1.1 存储结构 定长顺序存储 #define Maxsize 255typedef struct{char *ch[Maxsize];int length; }SString;堆分配存储 typedef struct{char *ch;int length; }HString;块链存储 4.1.2 基本操作 4.2 模式匹配&#xff08;子串定位&#xff09; 4.2.…

Docker面试整理-Docker Swarm是什么?

Docker Swarm 是 Docker 的原生集群管理和编排工具,用于将多个 Docker 主机集合成一个虚拟的 Docker 主机。它允许你在多台机器上部署、管理和扩展容器化应用,是构建和管理容器化应用的高可用集群的一种方式。 Docker Swarm 的核心特性包括: 1. 集群管理: ● Docker Swarm…

RaspAP:轻松实现树莓派无线 AP

RaspAP 是一个可以将树莓派轻松部署成无线 AP&#xff08;Access Point&#xff09;的软件方案&#xff0c;具有一套响应式的 WebUI 来控制 WiFi&#xff0c;用起来和家用路由器一样方便。RaspAP 可以运行在 Raspbian 上&#xff0c;只需要先给树莓派安装好 Raspbian 系统&…

12寸晶圆厂建设概述

1、关键步骤 半导体12英寸&#xff08;12吋&#xff09;晶圆厂的建厂过程是一个复杂且耗时的工程&#xff0c;涉及到多个阶段&#xff0c;包括但不限于以下几个关键步骤&#xff1a; 1. **项目规划与设计**&#xff1a;首先需要进行项目的可行性研究&#xff0c;确定产品定位…

docker和docker-compose的安装

docker的安装 1.安装 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun2.设置开机自启动 systemctl start docker #启动docker systemctl enable docker3.配置阿里云镜像 不配置镜像的话&#xff0c;进行 docker pull 等操作会比较慢。进入阿里云&…

Hudi Spark Sql Procedures 回滚 Hudi 表数据

前言 因为有 Hudi Rollback 的需求,所以单独总结 Hudi Spark Sql Procedures Rollback。 版本 Hudi 0.13.0(发现有bug)、(然后升级)0.14.1Spark 3.2.3Procedures 官方文档:https://hudi.apache.org/docs/procedures 相关阅读:Hudi Spark SQL Call Procedures学习总结…

【NI国产替代】电池模拟器,快速模拟 3C 产品电池的充放电功能

电池模拟器 快速模拟 3C 产品电池的充放电功能输出灵活可调节的电压/电流内置双向 DC-DC 降压变换器为 3C 产品提供漏电检测 电池模拟器系列包含单节双通道&#xff08;1S&#xff09;、双节双通道&#xff08;2S&#xff09;、三节单通道&#xff08;3S&#xff09;三种规格&…

C++基础与深度解析 | 异常处理 | 枚举与联合 | 嵌套类与局部类 | 嵌套名字空间与匿名名字空间 | 位域与volatile关键字

文章目录 一、异常处理二、枚举与联合三、嵌套类与局部类四、嵌套名字空间与匿名名字空间五、位域与volatile关键字 一、异常处理 异常处理用于处理程序在调用过程中的非正常行为。 传统的处理方法&#xff1a;传返回值表示函数调用是否正常结束。 例如&#xff0c;返回 0 表示…

中介子方程七

X$XFX$XEXyXαXiX$XαX$XiXαXyXEX$XFX$XEXyXαXiX$XαX$XiXαXyXEX$XαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XdX$XpX$XdX$XyXeXαX$XEXyXαXiX$XαX$XiXαXyXEX$XαXeXyX$XdX$XpX$XdX$XhXαXeX$XηXqXαXpX$XWXyX$XyXWX$XαXtXηXαXpX$XEX$XZX$XpXαXηXtXαX$XWXyX$…

SpringBoot+Vue教师工作量管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 教师管理员 功能截图

声量2024 | 脱离『生活监狱』——对部分主流价值的质疑与冒犯

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 阿那亚 联合制作 / 声量The Power of Voice 特别鸣谢 / 深夜谈谈播客网络 本期节目录制于第二届「声量The Power of Voic…

自定义类型:结构体+结构体内存对齐+结构体实现位段

结构体内存对齐实现位段 一.结构体1.结构体的声明2.结构体变量成员访问操作符3.结构体传参4.匿名结构体5.结构的自引用 二.结构体内存对齐1.对齐规则2.为什么存在内存对齐&#xff1f;3.修改默认对齐数 三.结构体实现位段1.什么是位段2.位段的内存分配3.位段的跨平台问题4.位段…

安卓打造安装包(应用打包、规范处理安装包、安全加固)

本章介绍应用安装包的基本制作规范&#xff0c;主要包括&#xff1a;如何导出既美观又精简的APK文件、如何按照上线规范调整App的相关设置、如何对APK文件进行安全加固以防止安装包被破解。 应用打包 本节介绍APK安装包的打包过程&#xff0c;包括&#xff1a;如何利用Androi…

SuntoryProgrammingContest2024(AtCoder Beginner Contest 357)(A~F)(最爱线段树的一集)

A - Sanitize Hands 题意&#xff1a; 模拟 // Problem: A - Sanitize Hands // Contest: AtCoder - SuntoryProgrammingContest2024&#xff08;AtCoder Beginner Contest 357&#xff09; // URL: https://atcoder.jp/contests/abc357/tasks/abc357_a // Memory Limit: 1024…

云服务器与虚拟服务器的区别

云服务器和虚拟服务器是两种常见的托管解决方案&#xff0c;它们有着各自适用的环境和功能&#xff0c;根据企业自身的需求来进行选择&#xff0c;本文主要来讨论一下云服务器和虚拟服务器的区别在哪里。 云服务器是基于云计算技术&#xff0c;将计算资源通过虚拟化技术整合在一…

嵌入式C中Hex与Bin文件对比分析

目录 一、引言 二、Hex文件格式 三、Bin文件格式 四、Hex与Bin的区别归纳 一、引言 在嵌入式系统开发中&#xff0c;Hex&#xff08;Intel Hexadecimal Object File Format&#xff09;和Bin&#xff08;Binary File Format&#xff09;是两种常见的文件格式&#xff0c;用…