题干:

给出一个长度为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的空间优化)相关推荐

  1. 51nod 1272 最大距离 O(nlog(n)) , 快排 , 最大连续子串

    题目: 解法:排序,把值小的和索引小的放在前面,记录一下之前索引最小的就可以了. 没什么可以讲的,上代码吧: #include <bits\stdc++.h> using namespac ...

  2. 51Nod 1102 面积最大的矩形 +1272 最大距离 单调栈

    51Nod 1102 面积最大的矩形 记笔记记笔记:对于区间最值与区间长度/和等的问题,用单调栈来维护区间端点. 这里来补一补单调栈和单调队列的基础知识: 单调栈:                   ...

  3. ❤️思维导图整理大厂面试高频数组19: 股票问题III的dp数组构建/初始化和空间优化难点, 力扣123❤️

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...

  4. Python编程基础:第五十四节 排序Sort

    第五十四节 排序Sort 前言 实践 前言 我们常需要对列表.元组中的元素进行排序,例如按照字母表排列学生的名称.这里就需要用到列表的sort()方法,以及sorted()函数. 实践 我们先来构建一 ...

  5. [转载]详细解说STL排序(sort)------这篇博文在一道题上救了我o_0

    详细解说 STL 排序(Sort) 作者Winter 原文地址:http://www.cppblog.com/mzty/archive/2005/12/15/1770.html 详细解说 STL 排序 ...

  6. Numpy 排序 -- sort()、argsort()

    Numpy 排序 – sort().argsort() 官方文档 1.内容排序:sort() 函数原型: 对数组本身进行排序 numpy.sort(a, axis=-1, kind='quicksor ...

  7. Python 排序 -- sort()、sorted()

    Python 排序 – sort().sorted() 1. 列表排序:sort() 函数原型: 直接对列表本身进行排序,不会返回新的列表 list.sort(cmp=None, key=None, ...

  8. SAP UI5 初学者教程之二十三 - 列表控件的排序 Sort 和分组 Group 试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

  9. C++ 二维vector排序(sort用法)

    C++二维vector排序 sort 函数的使用 sort 函数的使用 自定义排序函数 (目标:对 二维vector<vector> points中第二个元素进行排序) static bo ...

最新文章

  1. matlab中如何求零极点,Matlab中绘制零极点
  2. Edgy Trees
  3. mysql+根密码是什么意思,重设MySQL根密码
  4. Qt实践|HTTPS知识点-SSL socket获取百度首页
  5. 队列的链式存储结构及实现
  6. Devpress.XtraGrid.GridControl.GridView属性
  7. matlab条形指纹拼接,matlab实现的两幅指纹图像的拼接
  8. Linux 命令(111)—— alias 命令(builtin)
  9. js之类 面向对象的书写方式(详细篇)
  10. 解决Selenium2Library 导入报错问题
  11. 微信小程序 图片处理的几个样式
  12. Element 表格序号问题
  13. BDE Installer for RAD Studio
  14. 手机wifi显示未连接服务器,客户端显示wifi未连接到服务器
  15. numpy.array和python列表的转换
  16. 德勤oracle offer,会计工作:刚刚拿到德勤 Offer,和大家分享一下
  17. python 写word图表标题_工作汇报神技!用Python三步生成带有图表的word报表
  18. 透彻解析信号地与电源地的关系
  19. 利用Proteus仿真STM32实现按键控制LED灯设计
  20. 使用JXTA技术建立P2P网络(转)

热门文章

  1. dart 乘方运算符_Dart系列-运算符
  2. matlab晶闸管整流电路,采用Matlab/Simulink对三相桥式全控整流电路的仿真分析
  3. Mysql索引示例_MYSQL索引实例
  4. shell变量里的字符替换
  5. python网络通信框架_【python:flask-SocketIO】网络通信框架简单了解
  6. java符号引用 直接引用_Java -- JVM的符号引用和直接引用
  7. bucket sort sample sort 并行_MOOSE: 实现大规模并行多物理场仿真(二)
  8. 服务器怎么用光驱装系统教程,使用光驱重装系统详细教程
  9. ubuntu 14.04 ssh
  10. php怎么调试小程序,教你如何配置微信小程序