1.27学习总结

今天做了些队列的题:
1.逛画展(单调队列)
2.打印队列 Printer Queue(优先队列)
3.[NOIP2010 提高组] 机器翻译(模拟队列)
4.求m区间内的最小值(单调队列板子题)
5.日志统计(滑动窗口,双指针)

总结一下:单调队列使用STL的deque进行模拟,也可以用数组和双指针(head,tail),有两种操作,删头和去尾,实现一个区间内单调增或减的队列,经典的例题是滑动窗口,在用单调队列做题时,尽量队列内存的是索引,而不是这个数据本身

优先队列(堆)可用于求区间最值,数据较大的时候容易TLE

逛画展https://www.luogu.com.cn/problem/P1638

题目描述

博览馆正在展出由世上最佳的 �m 位画家所画的图画。

游客在购买门票时必须说明两个数字,�a 和 �b,代表他要看展览中的第 �a 幅至第 �b 幅画(包含 �,�a,b)之间的所有图画,而门票的价钱就是一张图画一元。

Sept 希望入场后可以看到所有名师的图画。当然,他想最小化购买门票的价格。

请求出他购买门票时应选择的 �,�a,b,数据保证一定有解。

若存在多组解,输出 �a 最小的那组

输入格式

第一行两个整数 �,�n,m,分别表示博览馆内的图画总数及这些图画是由多少位名师的画所绘画的。

第二行包含 �n 个整数 ��ai​,代表画第 �i 幅画的名师的编号。

输出格式

一行两个整数 �,�a,b。

输入输出样例

输入 #1复制

12 5
2 5 3 1 3 2 4 1 1 5 4 3

输出 #1复制

2 7

说明/提示

数据规模与约定
  • 对于 30%30% 的数据,有 �≤200n≤200,�≤20m≤20。
  • 对于 60%60% 的数据,有 �≤105n≤105,�≤103m≤103。
  • 对于 
  • 100%100% 的数据,有 1≤�≤1061≤n≤106,1≤��≤�≤2×1031≤ai​≤m≤2×103。
  • 思路:当还没有满足条件的时候一直入队,直到情况满足的时候,开始从头出队,直到情况未满足,找到所有可能的情况,并取出最小值
#include <bits/stdc++.h>
using namespace std;
int a[1000005];
int hash_count[20005];
int main()
{deque<int>q;int m,n;cin>>m>>n;int t=0;int min_length=m+2,l=0,r=m-1;for (int i=0;i<m;++i){cin>>a[i];if (hash_count[a[i]]==0)t++;hash_count[a[i]]++;q.push_back(i);while (t==n)//2 5 3 1 3 2 4 1 1 5 4 3{if (min_length>q.back()-q.front()){min_length=q.back()-q.front();l=q.front(),r=q.back();}hash_count[a[q.front()]]--;if (hash_count[a[q.front()]]==0)t--;q.pop_front();}}cout<<l+1<<" "<<r+1;
}

求m区间内的最小值https://www.luogu.com.cn/problem/P1440

题目描述

一个含有 �n 项的数列,求出每一项前的 �m 个数到它这个区间内的最小值。若前面的数不足 �m 项则从第 11 个数开始,若前面没有数则输出 00。

输入格式

第一行两个整数,分别表示 �n,�m。

第二行,�n 个正整数,为所给定的数列 ��ai​。

输出格式

�n 行,每行一个整数,第 �i 个数为序列中 ��ai​ 之前 �m 个数的最小值。

输入输出样例

输入 #1复制

6 2
7 8 1 4 3 2

输出 #1复制

0
7
7
1
1
3 

说明/提示

对于 100%100% 的数据,保证 1≤�≤�≤2×1061≤m≤n≤2×106,1≤��≤3×1071≤ai​≤3×107。

思路:模拟一个单调增的队列,队内没有的时候入队,有元素的时候判断,当前队尾元素是否小于将要入队的元素,如果不小于,那么队尾出队,直到找到一个小于的数或者队列空

#include <bits/stdc++.h>
using namespace std;
int a[2000005];
int main()
{int n,m;scanf("%d%d",&n,&m);deque<int>q;for (int i=0;i<n;++i){int x;scanf("%d",&x);a[i]=x;if (q.empty())printf("0\n");else printf("%d\n",a[q.front()]);while (!q.empty() && x<a[q.back()])q.pop_back();q.push_back(i);if (i-m==q.front())q.pop_front();}
}

日志统计https://www.luogu.com.cn/problem/P8661

题目描述

小明维护着一个程序员论坛。现在他收集了一份“点赞”日志,日志共有 �N 行。其中每一行的格式是 ts id,表示在 ��ts 时刻编号 ��id 的帖子收到一个“赞”。

现在小明想统计有哪些帖子曾经是“热帖”。如果一个帖子曾在任意一个长度为 �D 的时间段内收到不少于 �K 个赞,小明就认为这个帖子曾是“热帖”。

具体来说,如果存在某个时刻 �T 满足该帖在 [�,�+�)[T,T+D) 这段时间内(注意是左闭右开区间)收到不少于 �K 个赞,该帖就曾是“热帖”。

给定日志,请你帮助小明统计出所有曾是“热帖”的帖子编号。

输入格式

第一行包含三个整数 �N、�D 和 �K。

以下 �N 行每行一条日志,包含两个整数 ��ts 和 ��id。

输出格式

按从小到大的顺序输出热帖 ��id。每个 ��id 一行。

输入输出样例

输入 #1复制

7 10 2  
0 1  
0 10    
10 10  
10 1  
9 1
100 3  
100 3  

输出 #1复制

1  
3  

说明/提示

对于 50%50% 的数据,1≤�≤�≤10001≤K≤N≤1000。

对于 100%100% 的数据,1≤�≤�≤1051≤K≤N≤105,0≤��,��≤1050≤id,ts≤105。

思路:双指针+滑动窗口的做法,先按照时间排序。直到满足时间条件的时候,开始消除点赞数

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+50;
struct Node{int time;int id;
};
struct Node  a[N];
int nums[N];//记录每个id的点赞数 
int flag[N];//记录是热评的 	
bool cmp(Node &a,Node &b)
{if (a.time!=b.time)return a.time<b.time;else if (a.time==b.time)return a.id<b.id;
}
int main()
{int n,d,k;cin>>n>>d>>k;	for (int i=0;i<n;++i)cin>>a[i].time>>a[i].id;sort(a,a+n,cmp);for (int i=0,j=0;i<n;++i){nums[a[i].id]++;while (a[i].time-a[j].time>=d){nums[a[j].id]--;j++;}if (nums[a[i].id]>=k)flag[a[i].id]=1;}for (int i=0;i<N;++i){if (flag[i])cout<<i<<endl;}
}

机器翻译https://www.luogu.com.cn/problem/P1540

题目描述

小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。

这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。

假设内存中有 �M 个单元,每单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过 �−1M−1,软件会将新单词存入一个未使用的内存单元;若内存中已存入 �M 个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。

假设一篇英语文章的长度为 �N 个单词。给定这篇待译文章,翻译软件需要去外存查找多少次词典?假设在翻译开始前,内存中没有任何单词。

输入格式

共 22 行。每行中两个数之间用一个空格隔开。

第一行为两个正整数 �,�M,N,代表内存容量和文章的长度。

第二行为 �N 个非负整数,按照文章的顺序,每个数(大小不超过 10001000)代表一个英文单词。文章中两个单词是同一个单词,当且仅当它们对应的非负整数相同。

输出格式

一个整数,为软件需要查词典的次数。

输入输出样例

输入 #1复制

3 7
1 2 1 5 4 4 1

输出 #1复制

5

说明/提示

样例解释

整个查字典过程如下:每行表示一个单词的翻译,冒号前为本次翻译后的内存状况:

  1. 1:查找单词 1 并调入内存。
  2. 1 2:查找单词 2 并调入内存。
  3. 1 2:在内存中找到单词 1。
  4. 1 2 5:查找单词 5 并调入内存。
  5. 2 5 4:查找单词 4 并调入内存替代单词 1。
  6. 2 5 4:在内存中找到单词 4。
  7. 5 4 1:查找单词 1 并调入内存替代单词 2。

共计查了 55 次词典。

数据范围

  • 对于 10%10% 的数据有 �=1M=1,�≤5N≤5;
  • 对于 100%100% 的数据有 1≤�≤1001≤M≤100,1≤�≤10001≤N≤1000。

思路:队未满,开始入队,并且计数器要加1,队满开始出队和入队,计数器也加一

#include <bits/stdc++.h>
using namespace std;
int main()
{int m,n,cnt=0;cin>>m>>n;queue<int>q;//m是内存队列的长度最多等于m//这题主要难在找,用队列形成进去很简单int ans[1001];memset(ans,0,sizeof(ans));for (int i=0;i<n;++i){int x;cin>>x;if (ans[x]==0 && q.size()<m){q.push(x);ans[x]=1;	cnt++;}else if (ans[x]==1)continue;else if (ans[x]==0 && q.size()==m){ans[q.front()]=0;q.pop();	ans[x]=1;q.push(x);cnt++;}	}cout<<cnt; 
}

打印队列 Printer Queuehttps://www.luogu.com.cn/problem/UVA12100

学生会里只有一台打印机,但是有很多文件需要打印,因此打印任务不可避免地需要等待。有些打印任务比较急,有些不那么急,所以每个任务都有一个1~9间的优先级,优先级越高表示任务越急。

打印机的运作方式如下:首先从打印队列里取出一个任务J,如果队列里有比J更急的任务,则直接把J放到打印队列尾部,否则打印任务J(此时不会把它放回打印队列)。 输入打印队列中各个任务的优先级以及所关注的任务在队列中的位置(队首位置为0),输出该任务完成的时刻。所有任务都需要1分钟打印。例如,打印队列为{1,1,9,1,1,1},目前处于队首的任务最终完成时刻为5。

输入T 接下来T组数据 每组数据输入N,TOP。接下来N个数,TOP代表队列首

Translated by @HuangBo

输入输出样例

输入 #1复制

3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1

输出 #1复制

1
2
5

思路:用优先队列和普通队列存值,然后按照优先队列的出队顺序找到队列对应的值出队

#include <bits/stdc++.h>
using namespace std;
struct node{int x;int id;
}x2;
priority_queue<int>q;
queue<node>p;
int main()
{int t;cin>>t;while (t--){int m,n;cin>>m>>n;for (int i=0;i<m;++i){int l;cin>>l;q.push(l);p.push(node{l,i});}int tot=0;while (!q.empty()){int x1=q.top(); q.pop();while (x2=p.front(),x2.x!=x1){p.pop();p.push(x2);	}p.pop();tot++;if (x2.id==n){cout<<tot<<endl;break;}}while (!p.empty())p.pop();while (!q.empty())q.pop();} 
}

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

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

相关文章

3分钟 docker搭建 帕鲁服务器

1. 安装docker 1.安装依赖环境 yum -y install yum-utils device-mapper-persistent-data lvm22.设置镜像源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3.安装docker 3.1 yum makecache fast yum install docker-ce …

MongoDB:从容器使用到 Mongosh、Python/Node.js 数据操作

文章目录 1. 容器与应用之间的关系介绍2. 使用 Docker 容器安装 MongoDB3. Mongosh 操作3.1 Mongosh 连接到 MongoDB3.2 基础操作与 CRUD 4. Python 操作 MongoDB5. Nodejs 操作 MongoDB参考文献 1. 容器与应用之间的关系介绍 MongoDB 的安装有时候并不是那么容易的&#xff0…

消息中间件及java线程池

1. ActiveMQ是什么&#xff1f; Apache ActiveMQ是一个开源的消息中间件&#xff08;Message Oriented Middleware, MOM&#xff09;&#xff0c;它遵循Java消息服务&#xff08;Java Message Service, JMS&#xff09;规范&#xff0c;提供高效、可靠和异步的消息传递功能。Ac…

【从浅到深的算法技巧】初级排序算法 上

5.排序 5.1 初级排序算法 作为对排序算法领域的第一次探索&#xff0c; 我们将学习两种初级的排序算法以及其中种的一个变体。深入学习这些相对简单的算法的原因在于:第一,我们将通过它们熟悉些术语和简单的技巧 第二&#xff0c;这些简单的算法在某些情况下比我们之后将会讨论…

《HelloGitHub》第 94 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …

Redis6基础知识梳理~

初识NOSQL&#xff1a; NOSQL是为了解决性能问题而产生的技术&#xff0c;在最初&#xff0c;我们都是使用单体服务器架构&#xff0c;如下所示&#xff1a; 随着用户访问量大幅度提升&#xff0c;同时产生了大量的用户数据&#xff0c;单体服务器架构面对着巨大的压力 NOSQL解…

openssl3.2 - 测试程序的学习 - test\acvp_test.c

文章目录 openssl3.2 - 测试程序的学习 - test\acvp_test.c概述笔记要单步学习的测试函数备注END openssl3.2 - 测试程序的学习 - test\acvp_test.c 概述 openssl3.2 - 测试程序的学习 将test*.c 收集起来后, 就不准备看makefile和make test的日志参考了. 按照收集的.c, 按照…

换个思维方式快速上手UML和 plantUML——类图

和大多数朋友一样&#xff0c;Jeffrey 在一开始的时候也十分的厌烦软件工程的一系列东西&#xff0c;对工程化工具十分厌恶&#xff0c;觉得它繁琐&#xff0c;需要记忆很多没有意思的东西。 但是之所以&#xff0c;肯定有是因为。对工程化工具的不理解和不认可主要是基于两个逻…

【c++】类对象模型

1.如何计算类对象的大小 class A { public:void PrintA(){cout<<_a<<endl;} private:char _a; }; 问题&#xff1a;类中既可以有成员变量&#xff0c;又可以有成员函数&#xff0c;那么一个类的对象中包含了什么&#xff1f;如何计算一个类的大小&#xff1f; 2…

C++算法之枚举、模拟与排序

1.AcWing 1210.连号区间数 分析思路 由题意是在 1∼N 的某个排列中有多少个连号区间&#xff0c;所以每个数出现并且不重复&#xff01; 如果是连续的&#xff0c;那么Max-Minj-i&#xff08;[i,j]&#xff09; 代码实现 #include<iostream> #include<algorithm>…

关于AOP的@Around特殊处理RequestBody的使用小结

目录 1. 概述 1.1 背景 1.2 源码 2. 测试 2.1 Controller 2.2 SpecialName配置 2.3 RequestConverter 2.4 测试 最近项目上遇到一个这样的需求&#xff1a;用户请求的时候传过来A&#xff0c;在api处理过程中要把A当成B去处理&#xff0c;但是返回的标识中又必须是A作为…

freeswitch智能外呼系统搭建流程

1.获取实时音频数据 media_bug &#xff08;好多mrcp方式也崩溃所以用以下方式&#xff09; 可以参考 方式可以通过socket或者webscoket freeswitch[1.05]用websocket发送mediabug语音流到ASRProxy实现实时质检和坐席辅助 - 知乎 2.webscoket 好多c的库放模块容易崩溃 可以…

2. MySQL 多实例

重点&#xff1a; MySQL 的 三种安装方式&#xff1a;包安装&#xff0c;二进制安装&#xff0c;源码编译安装。 MySQL 的 基本使用 MySQL 多实例 DDLcreate alter drop DML insert update delete DQL select 2.5&#xff09;通用 二进制格式安装 MySQL 2.5.1&#xff…

Linux BIO如何下发到HDD?

在Linux操作系统中&#xff0c;当创建一个Block I/O请求&#xff08;BIO&#xff09;时&#xff0c;它会被封装成适合硬件交互的数据结构&#xff0c;并通过内核存储子系统传递到对应的硬件控制器上&#xff0c;如SAS&#xff08;Serial Attached SCSI&#xff09;HBA&#xff…

Linux ---- Shell编程之函数与数组

目录 一、函数 1、函数的基本格式 2、查看函数列表 3、删除函数 4、函数的传参数 5、函数返回值 实验&#xff1a; 1.判断输入的ip地址正确与否 2. 判断是否为管理员用户登录 6、函数变量的作用范围 7、函数递归&#xff08;重要、难点&#xff09; 实验&#xff1…

《Q年文峰》GPT应用的交互式非线性体验

Phoncent博客创始人庄泽峰把自己的小说《Q年文峰》做成GPT应用&#xff0c;显然这是一件值得探索且具有创新意义的事情。 因为传统的阅读体验是线性的&#xff0c;读者只能按照固定的情节顺序进行阅读&#xff0c;而把小说制作成GPT应用后&#xff0c;读者阅读小说的方式是非线…

力扣0085——最大矩形

最大矩形 难度&#xff1a;困难 题目描述 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例1 输入&#xff1a;matrix [["1","0","1","0",&qu…

分布式id-雪花算法

一、雪花算法介绍 Snowflake&#xff0c;雪花算法是有Twitter开源的分布式ID生成算法&#xff0c;以划分命名空间的方式将64bit位分割成了多个部分&#xff0c;每个部分都有具体的不同含义&#xff0c;在Java中64Bit位的整数是Long类型&#xff0c;所以在Java中Snowflake算法生…

2024年项目基金撰写与技巧及GPT融合

详情点击链接&#xff1a;2024年项目基金撰写与技巧及GPT融合 一&#xff1a;国自然项目 1.1项目 1.2接收情况 1.3受理情况 1.4近五年资助情况 1.5国自然改革解读 1.6博后项目 二&#xff1a;基金的撰写技巧 2.1 问题属性与评阅标准 2.2 前期准备工作-如何去选题 2.…

在线商城系统设计

设计一个在线商品商店的数据库模式涉及多个方面&#xff0c;包括产品、订单、用户、支付等。 数据库设计&#xff1a; 用户表 (Users): UserID (主键)用户名密码电子邮件地址电话号码 产品表 (Products): ProductID (主键)产品名称描述价格库存数量分类ID (外键&#xff0c;连接…