E. Exposition
题目链接:Problem - E - Codeforces
题目大意: 给你一个长度为n的序列,和一个整数k.现让找出所有连续的最长子区间, 其子区间的条件是:在区间里最大值减去最小值之差要小于 k .
输入:
输入数据的第一行包含两个用空格隔开的整数 n ( 1 ≤ n ≤ 1e5 )和 k ( 0 ≤ k ≤ 1e6 )
第二行包含 n 个整数,以空格分隔。每个数字 ai ( 1 ≤ ai ≤ 1e6 ).
输出:
在输出数据的第一行打印两个数字 a 和 b (用空格隔开),其中 a是每个区间的长度。b是个数
在接下来的 b 行中,每行打印两个整数,中间用空格隔开,起始位置与终点位置。
具体题目描述见链接。
方法: 线段树,ST表, 二分
1.由于题目要求是要,让最大值与最小值做差运算小于k. 所以不难想到用一个特殊的数据结构去维护最大值于最小值。
2.看数据范围 1e5, 暴力求解区间的满足情况是不行的, 考虑使用其它算法。 当发现若只有一个数时,那它的最大值减去最小值就为0(也就最小的情况)。区间覆盖的越广,差值可能就越大,有单调性。考虑二分。
3.二分: 通过枚举左边界[1,n], 然后通过最大值二分找出相应的右边界, 统计此时的区间最大值。然后使用map将区间长度一致的分在一起,
4.二分时,要查询[i, mid](代码里), 就要使用ST表或者线段树维护的最值。 此处的最大值二分见代码。
先贴ST表做法:
二分关键代码:
int mxx = 0; //记录最长的区间map<int, vector<pair<int,int>>> mp;//统计答案for(int i=1; i<=n; i++) {int l = i;int r = n;int dl = i;while(l<=r) { //二分右边界int mid = (l+r) >> 1;if(go(i,mid)<=k) { // go()函数查询的是差值,注意 i, 到middl = mid; //满足, 看是否还可以变长,最值二分l = mid+1;}else{r = mid-1;}}mp[dl-i+1].push_back({i,dl});// 分区间mxx = max(mxx, dl-i+1); // 找最长的}
ST表完整代码:
#include <bits/stdc++.h>
using namespace std;using i64 = long long;
using i128 = __int128;
using ui64 = unsigned long long;struct ST{vector<vector<int>> data;vector<int> lg2;int n;ST(){}ST(int n){innt(n);}void innt(int n){this->n = n;data.resize(n+1, vector<int>(32));lg2.resize(n+1);lg2[0] = -1;for(int i=1; i<=n; i++) {lg2[i] = lg2[i>>1] + 1;}}int gcd(int a, int b){return b==0? a : gcd(b, a%b);}void buildGcd(){for(int p=1; p<=lg2[n]; p++) {for(int i=1; i + (1<<p) - 1 <= n; i++) {data[i][p] = gcd(data[i][p - 1], data[i + (1 << (p-1))][p-1]);}}}int queryGcd(int l, int r){int p = lg2[r-l+1];return gcd(data[l][p], data[r-(1<<p)+1][p]);}void buildMax(){for(int p=1; p<=lg2[n]; p++) {for(int i=1; i + (1<<p) - 1<=n; i++) {data[i][p] = max(data[i][p-1], data[i + (1<<(p-1))][p-1]);}}}int queryMax(int l, int r){int p = lg2[r-l+1];return max(data[l][p], data[r-(1<<p)+1][p]);}void buildMin(){for(int p=1; p<=lg2[n]; p++) {for(int i=1; i + (1<<p) - 1<=n; i++) {data[i][p] = min(data[i][p-1], data[i + (1<<(p-1))][p-1]);}}}int queryMin(int l, int r){int p = lg2[r-l+1];return min(data[l][p], data[r-(1<<p)+1][p]);}void buildAnd(){for(int p=1; p<=lg2[n]; p++) {for(int i=1; i + (1<<p) - 1<=n; i++) {data[i][p] = data[i][p-1] & data[i + (1<<(p-1))][p-1];}}}int queryAnd(int l, int r){int p = lg2[r-l+1];return data[l][p] & data[r-(1<<p)+1][p];}void buildOr(){for(int p=1; p<=lg2[n]; p++) {for(int i=1; i + (1<<p) - 1<=n; i++) {data[i][p] = data[i][p-1] | data[i + (1<<(p-1))][p-1];}}}int queryOr(int l, int r){int p = lg2[r-l+1];return data[l][p] | data[r-(1<<p)+1][p];}
};ST stmi, stmx; //使用的封装好的ST表int go(int l, int r){ //做差值运算return stmx.queryMax(l, r) - stmi.queryMin(l, r);
}int main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, k;cin >> n >> k;stmi.innt(n), stmx.innt(n);for(int i=1; i<=n; i++) {int t;cin >> t;stmi.data[i][0] = stmx.data[i][0] = t;}stmi.buildMin();stmx.buildMax();//建ST表int mxx = 0;map<int, vector<pair<int,int>>> mp;for(int i=1; i<=n; i++) {int l = i;int r = n;int dl = i;while(l<=r) { //二分右边界int mid = (l+r) >> 1;if(go(i,mid)<=k) {dl = mid;l = mid+1;}else{r = mid-1;}}mp[dl-i+1].push_back({i,dl});mxx = max(mxx, dl-i+1);}cout << mxx << ' ' << mp[mxx].size() << "\n";for(auto[x, y] : mp[mxx]) {cout << x << " " << y << "\n";}return 0;
}
线段树做法, 二分方法一致。只是采用线段树维护最值了。
#include <bits/stdc++.h>
using namespace std;using i64 = long long;
using i128 = __int128;
using ui64 = unsigned long long;const int N = 1e5+3;
struct Node{int l, r;int mi, mx;
}tr[N<<2]; // 开四倍
int a[N];
int n, k;void up(int id){tr[id].mi = min(tr[id<<1].mi, tr[id<<1|1].mi);tr[id].mx = max(tr[id<<1].mx, tr[id<<1|1].mx);
}void build(int id, int l,int r){tr[id].l = l;tr[id].r = r;if(l==r) {tr[id].mi = tr[id].mx = a[r];return ;}int mid = (l+r)>>1;build(id<<1, l, mid);build(id<<1|1, mid+1, r);up(id);
}int query_mi(int id, int jobl, int jobr){if(jobl <= tr[id].l && tr[id].r<=jobr){return tr[id].mi;}int mid = (tr[id].l + tr[id].r) >>1;int res = INT_MAX;if(jobl <= mid) {res = min(res, query_mi(id<<1, jobl, jobr));}if(jobr > mid) {res = min(res, query_mi(id<<1 | 1, jobl, jobr));}return res;
}int query_mx(int id, int jobl, int jobr){if(jobl <= tr[id].l && tr[id].r<=jobr){return tr[id].mx;}int mid = (tr[id].l + tr[id].r) >>1;int res = INT_MIN;if(jobl <= mid) {res = max(res, query_mx(id<<1, jobl, jobr));}if(jobr > mid) {res = max(res, query_mx(id<<1 | 1, jobl, jobr));}return res;
}int go(int jobl, int jobr){return query_mx(1, jobl, jobr) - query_mi(1, jobl, jobr);
}int main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> k;for(int i=1; i<=n; i++) {cin >> a[i];}map<int, vector<pair<int,int>>> mp;build(1, 1, n); //建树int mxx = 0;for(int i=1; i<=n; i++) {int l = i;int r = n;int dl = i;while(l<=r) {int mid = (l+r)>>1;if(go(i,mid) <= k) {dl = mid;l = mid+1;}else{r = mid-1;}}mxx = max(mxx, dl - i + 1);mp[dl-i+1].push_back({i,dl});}cout << mxx << " " << mp[mxx].size() << "\n";for(auto [x,y] : mp[mxx]) {cout << x << " " << y << "\n";}return 0;
}
欢迎大佬指正,感谢你的收看与点赞。
相关文章:
E. Exposition
题目链接:Problem - E - Codeforces 题目大意: 给你一个长度为n的序列,和一个整数k.现让找出所有连续的最长子区间, 其子区间的条件是:在区间里最大值减去最小值之差要小于 k . 输入: 输入数据的第一行包…...
KVM虚拟化快速入门,最佳的开源可商用虚拟化平台
引言 在信息技术飞速发展的时代,服务器资源的高效利用成为企业关注的焦点。KVM 虚拟化作为一种先进的虚拟化技术,在众多虚拟化方案中脱颖而出,为企业实现服务器资源的优化配置提供了有效途径。 以往,物理服务器的资源利用效率较…...
unity删除了安卓打包平台,unityhub 还显示已经安装,怎么解决
解决问题地址 可能由于版本问题文章中这个我没搜到,应该搜Android Build Supprot...
软件工程-软件设计
包括 从管理的观点看包括: 详细设计 概要设计 从技术的观点看包括: 数据设计(详细设计) 系统结构设计(概要设计) 过程设计(详细设计) 任务 分析模型——》设计模型——》设…...
【Viper】配置格式与支持的数据源与go案例
Viper 是一个用于 Go 应用程序的配置管理库,支持多种配置格式和数据源。 安装依赖 go get github.com/spf13/viper go get github.com/spf13/viper/remote go get go.etcd.io/etcd/client/v3"github.com/spf13/viper/remote"要写在etcd客户端import里 1…...
C++ Primer 参数传递
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
数据结构 day06
数据结构 day06 6. 双向链表6.3. 双向循环链表 7. 树 tree7.1. 特点7.1.1. 什么是树7.1.2. 树的特性7.1.3. 关于树的一些术语 7.2. 二叉树7.2.1. 什么是二叉树7.2.2. 二叉树的性质7.2.3. 满二叉树和完全二叉树的区别7.2.4. 二叉树的遍历(画图)7.2.5. 二叉…...
AI编程01-生成前/后端接口对表-豆包(或Deepseek+WPS的AI
前言: 做过全栈的工程师知道,如果一个APP的项目分别是前端/后端两个团队开发的话,那么原型设计之后,通过接口文档进行开发对接是非常必要的。 传统的方法是,大家一起定义一个接口文档,然后,前端和后端的工程师进行为何,现在AI的时代,是不是通过AI能协助呢,显然可以…...
01什么是DevOps
在日常开发中,运维人员主要负责跟生产环境打交道,开发和测试,不去操作生产环境的内容,生产环境由运维人员操作,这里面包含了环境的搭建、系统监控、故障的转移,还有软件的维护等内容。 当一个项目开发完毕&…...
力扣100. 相同的树(利用分解思想解决)
Problem: 100. 相同的树 文章目录 题目描述思路Code 题目描述 思路 题目要求判断两个二叉树是否完全相同,而此要求可以利用问题分解的思想解决,即判断当前节点的左右子树是否完全相同,而在二叉树问题分解的一般题目中均会带有返回值ÿ…...
【深度学习模型分类】
深度学习模型种类繁多,涵盖了从基础到前沿的多种架构。以下是主要模型的分类及代表性方法: 1. 基础模型 1.1 多层感知机(MLP) 特点:全连接神经网络,适用于结构化数据。 应用:分类、回归任务…...
el-select 设置宽度 没效果
想实现下面的效果,一行两个,充满el-col12 然后设置了 width100%,当时一直没有效果 解决原因: el-form 添加了 inline 所以删除inline属性 即可...
chrome://version/
浏览器输入: chrome://version/ Google浏览器版本号以及安装路径 Google Chrome131.0.6778.205 (正式版本) (64 位) (cohort: Stable) 修订版本81b36b9535e3e3b610a52df3da48cd81362ec860-refs/branch-heads/6778_155{#8}操作系统Windows…...
反向代理块sjbe
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
封装一个sqlite3动态库
作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、项目案例 二…...
P1878 舞蹈课(详解)c++
题目链接:P1878 舞蹈课 - 洛谷 | 计算机科学教育新生态 1.题目解析 1:我们可以发现任意两个相邻的都是异性,所以他们的舞蹈技术差值我们都要考虑,4和2的差值是2,2和4的差值是2,4和3的差值是1,根…...
力扣第一题 哈希解法 O(n)时间复杂度
题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那俩个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返…...
【C++学习篇】C++11
目录 编辑 1. 初始化列表{} 1.1 C98中的{} 1.2 C11中的{} 2. C11中的std::initializer_list 3. 右值引用和移动语义 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延长生命周期 3.4 左值和右值的参数匹配 3.5 右值引⽤和移动语义的使⽤场景 3.5.1 左值引⽤…...
leetcode刷题第十天——栈与队列Ⅱ
本次刷题顺序是按照卡尔的代码随想录中给出的顺序 1047. 删除字符串中的所有相邻重复项 char* removeDuplicates(char* s) {int len strlen(s);char* tmp malloc(sizeof(char) * (len 1));int top -1, idx 0;while(idx < len) {if(top -1) tmp[top] s[idx];else {i…...
Vulnhub靶机随笔-Hackable II
Vulnhub靶机Hackable II详解 攻击机Kali IP:192.168.1.6 靶机 IP:未知 系统:未知 A.信息收集 扫描靶机存活性 确定IP地址 1.命令:arp-scan -l 扫描靶机开放端口及其服务版本信息 2.命令:nmap -A -p- -sV 靶机IP 3.靶机开放三个端口: 21ftp端口:存在anonymous匿…...
适配器模式 + 外观模式联合使用:新旧系统的平滑整合之道
🌟 引言:当系统演进遇到历史包袱 场景痛点: 假设企业需要将老旧的CRM系统与新的SaaS平台整合,面临: 旧系统接口:XML格式+同步调用新系统接口:JSON格式+异步调用需要统一提供简洁的RESTful API给前端若直接修改旧系统: // 旧系统核心类(无法修改) public class Leg…...
九.Spring Boot使用 ShardingSphere + MyBatis + Druid 进行分库分表
文章目录 前言一、引入依赖二、创建一个light-db_1备用数据库三、配置文件 application-dev.yml四、创建shardingsphere-config.yml完整项目结构 五、测试总结 前言 在现代化微服务架构中,随着数据量的不断增长,单一数据库已难以满足高可用性、扩展性和…...
【第2章:神经网络基础与实现——2.3 多层感知机(MLP)的构建与调优技巧】
在当今科技飞速发展的时代,人工智能早已不是一个陌生的词汇,它已经渗透到我们生活的方方面面,从智能语音助手到自动驾驶汽车,从图像识别到自然语言处理。而支撑这一切的核心技术之一,就是神经网络。作为机器学习领域的璀璨明星,神经网络已经在众多任务中取得了令人瞩目的…...
宠物企业宣传网站静态模板 – 前端静态页面开发实例
该宠物宣传企业站是一个基于前端技术构建的静态网站,旨在为宠物行业的企业提供一个简洁、现代的在线展示平台。整个网站采用HTML、CSS和JavaScript三种技术,确保了良好的用户体验和页面表现。 前端技术: HTML:HTML负责构建网站的…...
git如何下载指定版本
要使用Git下载指定版本,可以通过以下步骤进行操作: 1. 使用Git命令行下载指定版本: 1.1 首先,使用git clone命令克隆整个git库到本地。例如:git clone [库的URL]。这将下载最新的代码到本地。 1.2 进入克隆…...
【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)——4.2 LSTM的引入与解决长期依赖问题的方法】
在人工智能的璀璨星空中,深度学习模型犹如一颗颗耀眼的星辰,引领着技术的革新。而在处理序列数据的领域中,循环神经网络(RNN)无疑是那颗最为亮眼的星星。然而,即便是这样强大的模型,也面临着一些棘手的问题,其中最突出的便是长期依赖问题。今天,我们就来深入探讨一下长…...
IoTDB 集群节点 IP 改变,如何更新集群
问题 问题1:如果 IoTDB 配置的时候用的 IP,没有用 hostname,后面 IP 修改了,历史数据需要重新导吗? 问题2:如果现场运行 IoTDB 半年,电脑 IP 要改的话,半年的数据要导出来再导入么…...
C++ 设计模式-建造者模式
以下是一个完整的C建造者模式示例,包含产品类、建造者接口、具体建造者、指挥者以及测试代码: #include <iostream> #include <string> #include <memory>// 产品类:汽车 class Car { public:void setBody(const std::str…...
词袋模型和词嵌入模型区别和关联分析(词袋模型是否属于词嵌入模型)
词袋模型(Bag of Words, BoW)不属于词嵌入模型,它们是两种完全不同的文本表示方法。以下从多个维度对比二者的核心区别 1. 本质区别 特性词袋模型 (BoW)词嵌入模型 (Word Embedding)表示形式离散的稀疏向量(高维,维度…...
png、jpg、gif、webp的区别
png、jpg、gif、webp的区别 1.img的格式2.问题 1.img的格式 png 无损压缩,尺寸体积比jpg/jpeg大;适合做小图标jpg 采用了压缩算法,有一点失真,比png体积小;适合中大型图片gif 动态图webp 同时支持有损和无损压缩,相同质量的图片,webp具有更小的体积,但兼容性不太好(在某些浏览…...
