【51Nod - 1272 】最大距离 (思维,排序sort的空间优化)
题干:
给出一个长度为N的整数数组A,对于每一个数组元素,如果他后面存在大于等于该元素的数,则这两个数可以组成一对。每个元素和自己也可以组成一对。例如:{5, 3, 6, 3, 4, 2},可以组成11对,如下(数字为下标):
(0,0), (0, 2), (1, 1), (1, 2), (1, 3), (1, 4), (2, 2), (3, 3), (3, 4), (4, 4), (5, 5)。其中(1, 4)是距离最大的一对,距离为3。
Input
第1行:1个数N,表示数组的长度(2 <= N <= 50000)。
第2 - N + 1行:每行1个数,对应数组元素Ai(1 <= Ai <= 10^9)。
Output
输出最大距离。
Sample Input
6 5 3 6 3 4 2
Sample Output
3
解题报告:
这题第一反应是线段树,,但是想想思维题怎么可能上数据结构呢?所以开始往思维方面想,无非就是结构体存位置,排序,开一个数组存某个数最早(或晚)出现的位置等等方法呗、、、
线段树也不难想,离散化一下之后从头到尾扫,在离散化后的值那个权值那里存一下下标,并标记说这个值已经出现过了,即维护每个数字出现的最早时刻,即最小下标,然后扫到下一个数a[i]查询1~getpos(a[i])查询区间最小值,维护差的最大值就可以了。getpos是找到a[i]对应的离散化以后的值。
这题我还想到了可否用set<pair>去维护,在线更新set,这样满足了每次查找的元素出现的先后关系,但是对于值的大小,emmm,不好搞啊。反正51Nod - 1065这题是可以set做的。
这题看看代码就懂了,题目中有两个要素,元素的先后出现的关系,关系是大于等于。排序的目的就是为了先满足后者(因为后者最麻烦所以先让他满足)(为啥最麻烦呢?因为看前后的话比较一下pos然后维护最小值就可以了,但是对于值的话,无法满足这个单调性,也就是,不好满足前缀可维护关系,所以我们先排序,排除了这个因素,剩下的就是维护一个pos最小值了。)
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,ans;
struct Node {int val,pos;
} node[50000 + 5];
bool cmp(const Node& a,const Node& b) {if(a.val!= b.val) return a.val < b.val;return a.pos < b.pos;
}
int main()
{cin>>n;for(int i = 1; i<=n; i++) {scanf("%d",&node[i].val);node[i].pos = i;}sort(node+1,node+n+1,cmp);int curpos = node[1].pos;for(int i = 1; i<=n; i++) {curpos = min(curpos,node[i].pos);ans = max(ans,node[i].pos - curpos); }printf("%d\n",ans);return 0 ;
}
另:如果要求了空间复杂度,那么就不能排序解决了,这时候考虑用优先队列去优化空间。 (很巧妙但是可能只有面试的时候会遇到对空间有特别的要求的)
AC代码2:(空间复杂度o(1)的版本)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct Node {int val,pos;friend bool operator <(Node x,Node y) {if(x.val==y.val) return x.pos>y.pos;return x.val>y.val;}
};
priority_queue<Node> pq;
int n;
int main() {cin>>n;Node tmp;for(int i = 1; i<=n; i++) {scanf("%d",&tmp.val);tmp.pos=i;pq.push(tmp);}int cur=n,ans=0;while(!pq.empty()) {Node now = pq.top();pq.pop();if(now.pos<cur) cur=now.pos;ans=max(ans,now.pos-cur);}printf("%d\n",ans);return 0;
}
【51Nod - 1272 】最大距离 (思维,排序sort的空间优化)相关推荐
- 51nod 1272 最大距离 O(nlog(n)) , 快排 , 最大连续子串
题目: 解法:排序,把值小的和索引小的放在前面,记录一下之前索引最小的就可以了. 没什么可以讲的,上代码吧: #include <bits\stdc++.h> using namespac ...
- 51Nod 1102 面积最大的矩形 +1272 最大距离 单调栈
51Nod 1102 面积最大的矩形 记笔记记笔记:对于区间最值与区间长度/和等的问题,用单调栈来维护区间端点. 这里来补一补单调栈和单调队列的基础知识: 单调栈: ...
- ❤️思维导图整理大厂面试高频数组19: 股票问题III的dp数组构建/初始化和空间优化难点, 力扣123❤️
此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...
- Python编程基础:第五十四节 排序Sort
第五十四节 排序Sort 前言 实践 前言 我们常需要对列表.元组中的元素进行排序,例如按照字母表排列学生的名称.这里就需要用到列表的sort()方法,以及sorted()函数. 实践 我们先来构建一 ...
- [转载]详细解说STL排序(sort)------这篇博文在一道题上救了我o_0
详细解说 STL 排序(Sort) 作者Winter 原文地址:http://www.cppblog.com/mzty/archive/2005/12/15/1770.html 详细解说 STL 排序 ...
- Numpy 排序 -- sort()、argsort()
Numpy 排序 – sort().argsort() 官方文档 1.内容排序:sort() 函数原型: 对数组本身进行排序 numpy.sort(a, axis=-1, kind='quicksor ...
- Python 排序 -- sort()、sorted()
Python 排序 – sort().sorted() 1. 列表排序:sort() 函数原型: 直接对列表本身进行排序,不会返回新的列表 list.sort(cmp=None, key=None, ...
- SAP UI5 初学者教程之二十三 - 列表控件的排序 Sort 和分组 Group 试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...
- C++ 二维vector排序(sort用法)
C++二维vector排序 sort 函数的使用 sort 函数的使用 自定义排序函数 (目标:对 二维vector<vector> points中第二个元素进行排序) static bo ...
最新文章
- matlab中如何求零极点,Matlab中绘制零极点
- Edgy Trees
- mysql+根密码是什么意思,重设MySQL根密码
- Qt实践|HTTPS知识点-SSL socket获取百度首页
- 队列的链式存储结构及实现
- Devpress.XtraGrid.GridControl.GridView属性
- matlab条形指纹拼接,matlab实现的两幅指纹图像的拼接
- Linux 命令(111)—— alias 命令(builtin)
- js之类 面向对象的书写方式(详细篇)
- 解决Selenium2Library 导入报错问题
- 微信小程序 图片处理的几个样式
- Element 表格序号问题
- BDE Installer for RAD Studio
- 手机wifi显示未连接服务器,客户端显示wifi未连接到服务器
- numpy.array和python列表的转换
- 德勤oracle offer,会计工作:刚刚拿到德勤 Offer,和大家分享一下
- python 写word图表标题_工作汇报神技!用Python三步生成带有图表的word报表
- 透彻解析信号地与电源地的关系
- 利用Proteus仿真STM32实现按键控制LED灯设计
- 使用JXTA技术建立P2P网络(转)
热门文章
- dart 乘方运算符_Dart系列-运算符
- matlab晶闸管整流电路,采用Matlab/Simulink对三相桥式全控整流电路的仿真分析
- Mysql索引示例_MYSQL索引实例
- shell变量里的字符替换
- python网络通信框架_【python:flask-SocketIO】网络通信框架简单了解
- java符号引用 直接引用_Java -- JVM的符号引用和直接引用
- bucket sort sample sort 并行_MOOSE: 实现大规模并行多物理场仿真(二)
- 服务器怎么用光驱装系统教程,使用光驱重装系统详细教程
- ubuntu 14.04 ssh
- php怎么调试小程序,教你如何配置微信小程序