Cow Lineup S——离散化、单调队列、双指针

题目描述

思路

  • x、id不大于1亿,数据量太大,使用离散化
  • 将id离散化成一串从1开始连续的编号,使用map集合进行离散化
  • 使用双指针维护一段区间,这段区间满足每个编号都包含

如何使用map集合进行离散化?

  • 维护一个变量nums,从1开始,每个编号的牛第一次被遍历的时候将nums作为新的编号,nums++
  • 使用map集合判断这个牛的编号是不是第一次遍历, key值表示原编号,value表示新的编号
  • 用一个结构体存储牛的信息:位置和编号,按位置进行排序,并且进行离散化的时候,将编号进行更新
  • 定义一个队列,队列中存储每头牛的信息,将新的牛从队尾插入,并且记录这头牛的编号是否是第一次入列,当每个编号的牛都入列了,当前区间满足条件,进行比较
  • 当最后一头牛入列并且队头存储的牛的编号只有一种时,退出循环

代码实现

#include <iostream>
#include <map>
#include <algorithm>using namespace std;const int N = 50010;
map<int, int> a;	// 将ID编号离散化成一串连续的编号
int c[N];	// 下标为编号,出现了多少次
int nums;	// 牛的种类
int n;struct node
{int x, id;
}niu[N], q[N];	// niu表示每头牛的信息:位置和编号	// q表示队列,存储牛的信息bool cmp(node a, node b)
{return a.x < b.x;
}int main()
{cin >> n;for(int i = 0;i < n;i ++){int id;cin >> niu[i].x >> id;if(!a.count(id))	// 如果当前编号没有出现过,牛的种类加1{nums++;a[id] = nums;}niu[i].id = a[id]; // 将编号更新成新的编号}sort(niu, niu + n, cmp);	// 按位置进行排序int hh = 0, tt = 0;	// hh队头、tt队尾int res = 0;	// 表示当前队列中有多少不同编号的牛q[tt] = {niu[0].x, niu[0].id};	// 先将第一头牛的信息加入到队列中res++;int ress = 0x3f3f3f3f;	// 满足条件的区间长度(是牛的位置距离)c[niu[0].id]++;	// 记录每个编号出现的次数while(hh <= tt){while(c[q[hh].id] > 1)	// 判断队头,如果队头在队列中重复了,那么将队头弹出,// 并且减少队头编号的数量,保证队列中满足条件并且位置距离最短{c[q[hh].id]--;hh++;}if(res == nums)	// 当前队列满足条件,比较位置距离{ress = min(ress, q[tt].x - q[hh].x);}if(tt == n-1) break;	// 如果最后一头牛已经入队了,并且队头没有牛可以弹出了,循环结束// 将新的牛加入到队尾中,并且判断这个牛的编号是不是第一次出现q[++tt] = {niu[tt].x, niu[tt].id};if(c[niu[tt].id] == 0) res++;c[niu[tt].id]++;}cout << ress << endl;return 0;
}

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

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

相关文章

工业镜头中的远心镜头与普通镜头的光路

普通镜头&#xff1a; 主光线与镜头光轴有角度&#xff0c;工件上下移动时&#xff0c;像的大小有变化。 FOV&#xff1e;镜头前端直径。 物方远心镜头&#xff1a; 物方主光线平行于光轴&#xff0c;物距发生改变时&#xff0c;像高不会发生改变&#xff0c;测得的物体尺寸大…

Redis缓存穿透、击穿、雪崩

一、Redis的缓存穿透 1.什么是缓存穿透&#xff1f; 缓存穿透是指&#xff1a;客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这时缓存就永远不会生效&#xff0c;这些请求都打到数据库从而导致数据库压力过大。 2.出现缓存穿透的解决方案&#xff0c;以下是常用的两…

redis运维(五)再探redis

一 redis概述 ① redis简介 redis三大特性&#xff1a; 缓存、分布式内存数据库、持久化说明&#xff1a;非必须不建议在redis终端操作 ② redis亮点 ③ 初露锋芒 redis-benchmark redis-benchmark并发压力测试的问题解析 备注&#xff1a;多次测试取平均值,最好在物理机…

JVM内存模型:理解Java程序的内存管理

JVM内存模型&#xff1a;理解Java程序的内存管理 在Java编程中&#xff0c;JVM&#xff08;Java虚拟机&#xff09;是程序的运行环境&#xff0c;它负责管理程序的内存。JVM内存模型是Java语言规范中定义的一套规则&#xff0c;用于描述在JVM中程序如何通过内存来交互和操作。…

如何通过数据治理来提升业务价值——业务场景治理

数据治理&#xff0c;一方面是为了对数据的规范管理和控制&#xff0c;还有一方面是让数据能够为业务提供服务和创造价值。近些年来&#xff0c;随着数据治理技术发生着日新月异的变化&#xff0c;行业对数据治理的需求和指导也被逐步推进和实践&#xff0c;从宏观上看&#xf…

Django模版层

解析: forloop内置对象:运行结果解析 counter0: 从0开始计数 counter : 从1开始计数 first: True,判断循环的开始 last : Tues,判断循环的结束模版变量的书写 我们可以在html中编写python代码。 演示&#xff1a; {{ 填写变量 }}{% 填写类的 %}{{ d.0 }} {{ d.1 }…

CentOS挂载:解锁文件系统的力量

目录 引言1 挂载简介2 挂载本地分区3 挂载网络共享文件系统4 使用CIFS挂载结论 引言 在CentOS&#xff08;一种基于Linux的操作系统&#xff09;上挂载文件系统是一项常见而重要的任务&#xff0c;无论是将新的磁盘驱动器添加到系统&#xff0c;还是挂载网络共享资源&#xff…

Amazon Bedrock | 大语言模型CLAUDE 2体验

这场生成式AI与大语言模型的饥饿游戏&#xff0c;亚马逊云科技也参与了进来。2023年&#xff0c;亚马逊云科技正式发布了 Amazon Bedrock&#xff0c;是客户使用基础模型构建和扩展生成式AI应用程序的最简单方法&#xff0c;为所有开发者降低使用门槛。在 Bedrock 上&#xff0…

面试经典(6/150)轮转数组

面试经典&#xff08;6/150&#xff09;轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 以下为自己的思路&#xff0c;我不明白最终的返回值为什么有误&#xff0c;好像是题目里要求原地解决问题&#xff0c;而我创…

K8S篇之k8s containerd模式fail to pull image certificate signed by unknown authority

一、前言 解决"k8s containerd模式fail to pull image certificate signed by unknown authority"的问题 二、操作步骤 您有两个选择&#xff1a;配置证书或禁用证书验证。 具体步骤如下&#xff1a; 方法一&#xff1a;配置证书 找到未知机构签名的证书文件&#x…

TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…

YOLOv5 分类模型 Top 1和Top 5 指标实现

YOLOv5 分类模型 Top 1和Top 5 指标实现 flyfish import time from models.common import DetectMultiBackend import os import os.path from typing import Any, Callable, cast, Dict, List, Optional, Tuple, Union import cv2 import numpy as npimport torch from util…

集合对象的几种初始化方式

最简单的方式是通过new构建一个对象&#xff0c;构建对象后再进行赋值&#xff1a; // 通过new创建并赋值 List<Integer> list new ArrayList<>(); list.add(1); list.add(2); list.add(3);Set<Integer> set new HashSet<>(); set.add(1); set.add(…

小米路由器4A千兆版刷入OpenWRT并远程访问

小米路由器4A千兆版刷入OpenWRT并远程访问 文章目录 小米路由器4A千兆版刷入OpenWRT并远程访问前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理…

SpringBoot-配置文件properties/yml分析+tomcat最大连接数及最大并发数

SpringBoot配置文件 yaml 中的数据是有序的&#xff0c;properties 中的数据是无序的&#xff0c;在一些需要路径匹配的配置中&#xff0c;顺序就显得尤为重要&#xff08;例如在 Spring Cloud Zuul 中的配置&#xff09;&#xff0c;此时一般采用 yaml。 Properties ①、位…

0基础如何学习软件测试?10分钟给你安排明白

先上一张学习路线&#xff1a; 在测试行业已经呆了5年多了&#xff0c;也算得上行业经验资深了吧&#xff0c;基本上也是摸清了这个行业的发展。 所以今天也想对有转行想法的朋友分享一下经验&#xff0c;能够让你对这个行业有个大致的了解和对以后的发展有所规划&#xff0c;…

基础工具类

IDate import java.text.SimpleDateFormat import java.util.{Calendar, Date}trait IDate extends Serializable {def onDate(dt: String): Unitdef invoke(dt: String, dt1: String) {if (dt1 < dt) {throw new IllegalArgumentException(s"dt1:${dt1}小于dt:${dt}…

Java设计模式-创建型模式-原型模式

原型模式 原型模式浅拷贝深拷贝 原型模式 要求&#xff1a;以一个已经创建的对象为原型&#xff0c;复制一个新的对象 使用场景&#xff1a; 创建对象的成本比较大的时候&#xff08;如从耗时较长的计算或者从查询耗时长的RPC接口获取数据&#xff09;&#xff0c;直接拷贝已…

双向链表的知识点+例题

1.链表的种类 题中常考查以下两种&#xff1a; 上一讲我们学了无头单向非循环链表&#xff0c;这节&#xff0c;让我们看一下双向链表的操作吧~ 2基本操作 1&#xff0c;定义双向链表 2&#xff0c;创建一个节点 3&#xff0c;初始化双链表 4&#xff0c;尾插一个节点 5打印…