题目

2019.9.7,icpc徐州网络赛的E题 XKC's basketball team ,计蒜客上还可以做。

链接:https://nanti.jisuanke.com/t/41387

Input

The first line contains two integers n and m ( 2 ≤ n ≤ 5∗10^5 ,0 ≤ m ≤ 10^9) .

The following  line contain n integers W1​..Wn​(0 ≤ Wi​ ≤ 10^9) .

Output

A row of n integers separated by spaces , representing the anger of every member .

样例输入

6 13 4 5 6 2 10

样例输出

4 3 2 1 0 -1

题意:

对于数组中的每个元素来说,如果它加上m之后,右边仍然有比它大的数(有多个的话,取距离最远的),这个距离就是我们要的结果,不存在取 -1。所以问题就是,取得数组中每个元素右边最后一个比它大的元素。

思路:

看了 “O(n) 取得数组中每个元素右边第一个比它大的元素” 的思路想到的。

  • 建立一个Node (value, index);value是原数组的值 + m,index是对应的索引。(具体的value是什么,视问题而定)
  • 建立壹 Node 的 value 值升序的优先级队列。也就是小根堆。
  • i = n - 1,开始向前遍历

不断用当前堆顶的value值与arr[i]进行比较,如果堆顶元素小于arr[i],则找到需要找的元素。因为堆顶是最小的元素,如果堆顶大于arr[i],则i--,继续重复当前步骤。

  • 直到遍历完成,堆中大概率还会剩下几个(加+m之后,原数组中没有元素比它们大了),这些元素对应的 res 都是 -1 。
 #include <iostream>
#include <queue>
#include <stdio.h>
using namespace std; int arr[];
int anger[]; struct Node {
int value, index;
Node(int v, int i) :value(v), index(i) {};
bool operator< (const Node& n)const {
return n.value < value;
}
};
priority_queue <Node>pq; int main() {
int n, m;
cin >> n >> m;
for (int i = ; i < n; i++) {
scanf("%d", &arr[i]);
anger[i] = -;
pq.push(Node(arr[i] + m, i));
} for (int i = n - ; i >= ; i--) {
while (!pq.empty()) {
int top = pq.top().value;
if (arr[i] >= top) {
int index = pq.top().index;
pq.pop();
if (i > index) {
anger[index] = i - index - ;
}
else anger[index] = -;
}
else break;
}
} for (int i = ; i < n; i++) {
printf("%d", anger[i]);
if (i != n - )printf(" ");
} return ;
}

O(n) 取得数组中每个元素右边最后一个比它大的元素的更多相关文章

  1. O(n) 取得数组中每个元素右边第一个比它大的元素

    题目: 给定一个整型数组,数组元素随机无序的,要求打印出所有元素右边第一个大于该元素的值. 如数组A=[6,8,9,2,3,5,6] 输出[8,9,-1,3,5,6,-1] 思路: 我们用栈来保存未找 ...

  2. 剑指offer1: 组类型——二维数组中的查找(给定一个数字,查找是否在该数组中)

    1. 思路: 缩小范围 2. 方法: (1)要查找的数字等于数组中的数字,结束查找过程: (2)要查找的数字小于数组中的数字,去除该数字右边的数字,在剩下的数字里查找: (3)要查找的数字大于数组中的 ...

  3. smarty中ifelse、foreach以及获取数组中键值名的一个实例

    <{if empty($history)}> <tr> <td colspan="6">Not any records!</td> ...

  4. 返回数组中指定的一列,将键值作为元素键名array_column

    array_column() 函数 从记录集中取出 last_name 列: <?php // 表示由数据库返回的可能记录集的数组 $a = array( array( 'id' => 5 ...

  5. smarty中判断一个变量是否存在于一个数组中或是否存在于一个字符串中?

    smarty支持php的系统函数可以直接使用{if in_array($str, $arr) || strpos($str, $string)} yes {else} no{/if}

  6. js在数组中查找是否存在某一个数值

    目前想到的方法有这么几个 1.indexOf()  -> ES5 const array = ['apple', 'banance', 'orange'] array.indexOf('appl ...

  7. JS判断数组中的对象的每一个值不能为空

    方法一:使用every()函数,此函数不怎么常用,想要了解更多请自查 //表格 evaluateData为表格的数据 <el-table id="out-table3" :d ...

  8. leetcode 496下一个更大的元素I

    单调递减栈来做,time O(n),spaceO(n)需要一个哈希map class Solution { public: vector<int> nextGreaterElement(v ...

  9. 【Offer】[53-3] 【数组中数值和下标相等的元素】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 假设一个单调递增的数组里的每个元素都是整数并且是唯一的.请编程实现一个函数,找出数组中任意一个数值等于其下标的元素.例如,在数组{-3, ...

随机推荐

  1. 简单工厂(二)——coding

    public abstract class Video { public abstract void produce(); } public class JavaVideo extends Video ...

  2. Spring的@Autowired和@Resource注入

    @Autowired的原理 Spring@Autowired注解与自动装配 @Autowired 与@Resource的区别(详细) spring不但支持自己定义的@Autowired注解,还支持几个 ...

  3. python 的技巧

    pi = 0 n = 100 for k in range(n): pi+=1/pow(16,k)*(\ #一行不够写或不易读时用\,则多行与一行一样 4/(8*k+1)-2/(8*k+4)-\ 1/ ...

  4. 032 SSM综合练习08--数据后台管理系统--jsp页面显示当前用户名

    1. 页面端标签控制权限 在jsp页面中我们可以使用spring security提供的权限标签来进行权限控制. (1)在pom文件中导入依赖 <dependency> <group ...

  5. python学习-36 文件处理b模式

    文件处理b模式 1.以2进制的方式读取 f = open('test.txt','rb') #以b模式就不能指定encoding data = f.read() print(data) f.close ...

  6. Python之路【第二十三篇】:数据库基础

    数据库的简介 数据库 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易扩展性, ...

  7. [loj 6253] Yazid的新生舞会

    (很久之前刷的题现在看起来十分陌生a) 题意: 给你一个长度为n的序列A,定义一个区间$[l,r]$是“新生舞会的”当且仅当该区间的众数次数严格大于$\frac{r-l+1}{2}$,求有多少子区间是 ...

  8. kibana内存设置

    kibana是一个基于NodeJS的单页web应用.而NodeJS则是基于Chrome V8引擎的.V8引擎对于内存的使用是有限制的,默认情况下,64位系统下约为1.4GB,32位系统下约为0.7GB ...

  9. java之spring mvc之数据处理

    1. 页面中数据提交到 Controller 中如何处理 a) 如果自定义 Controller 是实现 spring 的 Controller 的接口,那么可以通过 HttpServletReque ...

  10. MVC学习笔记(一)—用EF创建数据库

    1.新建MVC项目     2.在Models文件夹下添加名为User的新类   2.1 Users类中的代码为: public class Users { /// <summary> / ...