AcWing 1238 日志统计(双指针算法)

news2024/9/25 13:24:08

题目概述

小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有 N 行。
其中每一行的格式是:

ts id

表示在 ts 时刻编号 id 的帖子收到一个”赞”。
现在小明想统计有哪些帖子曾经是”热帖”。
如果一个帖子曾在任意一个长度为 D 的时间段内收到不少于 K 个赞,小明就认为这个帖子曾是”热帖”。
具体来说,如果存在某个时刻 T 满足该帖在 [ T , T + D ) [T,T+D) [T,T+D)
这段时间内(注意是左闭右开区间)收到不少于 K 个赞,该帖就曾是”热帖”。
给定日志,请你帮助小明统计出所有曾是”热帖”的帖子编号。

输入格式

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

输出格式

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

数据范围

1 ≤ K ≤ N ≤ 1 0 5 , 1 ≤ K ≤ N ≤10^5, 1KN105,
0 ≤ t s , i d ≤ 1 0 5 0 ≤ ts, id ≤ 10^5 0ts,id105
1 ≤ D ≤ 10000 1 ≤ D ≤ 10000 1D10000

输入样例:

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

输出样例:

1
3

双指针算法是一种优化的思想,我们可以先想一下暴力的做法。
题意:有n条日志,统计在某个时间长度为d的区间中如果帖子的点赞数 >= k,那就判断它是热帖。最后输出所有热帖。
那么我们如果要暴力的话就是从小到大枚举每一个时间段,统计该时间段中各帖子的点赞情况,若满足条件就输出帖子id。这样的话时间复杂度也要 1 0 9 10^9 109,肯定是通过不了,我们需要进行优化。第一层循环不好优化,我们只能想办法优化里面的内容。

请添加图片描述
我们可以发现,在相邻的两个时间段中,大部分都是重复的,那么第二个时间段的结果不就是上一个减去时间i时的点赞,加上时间j时的点赞,这样我们就用两个指针将其优化为一重循环了

  • 完整代码
    里面还是有一些细节的
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
// 方便书写
#define x first
#define y second

// 用pair对来存储日志,方便排序(pair对默认根据第一元素升序排列)
typedef pair<int, int> PII;
const int N = 100005;
int n, d, k;
PII logs[N]; // 表示日志
int cnt[N];
bool st[N];
int main() {
	cin >> n >> d >> k;
	for (int i = 0; i < n; i ++)
		cin >> logs[i].x >> logs[i].y;

	sort(logs, logs + n);
	// i在前,j在后
	for (int i = 0, j = 0; j < n; j ++) {
		// 每次都添加一条日志
		int id = logs[j].y;
		cnt[id] ++;
		// 如果时间满了,就移动i指针,这里不能写成if循环,一个时间点可能有多条日志
		while (logs[j].x - logs[i].x >= d) {
			cnt[logs[i].y] --;
			i ++;
		}

		if (cnt[id] >= k)
			st[id] = true;
	}

	for (int i = 0; i <= 100000; i ++) {
		if (st[i])
			cout << i << endl;
	}
}
  • 本题的分享就结束了,本题主要就是学习一个双指针的优化思想,第一次思考不好理解。
    别忘了点赞关注加收藏!

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

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

相关文章

《MySQL 简易速速上手小册》第1章:MySQL 基础和安装(2024 最新版)

文章目录 1.1 MySQL 概览&#xff1a;版本、特性和生态系统1.1.1 基础知识1.1.2 重点案例1.1.3 拓展案例 1.2 安装和配置 MySQL1.2.1 基础知识1.2.2 安装步骤1.2.3 重点案例1.2.4 拓展案例 1.3 基础命令和操作1.3.1 基础知识1.3.2 重点案例1.3.3 拓展案例 1.1 MySQL 概览&#…

JUC ThreadLocal

文章目录 ThreadLocal ^1.2^ 的作用使用场景示例1ThreadLocal 变量初始化ThreadLocal 源码分析源码分析总结 内存泄漏问题示例说明new Thread 方式 执行结果pool 方式执行结果原因解析总结 ThreadLocal 1.2 的作用 ThreadLocal 为每个线程提供单独的变量副本。每个变量副本都是…

史上最全嵌入式(学习路线、应用开发、驱动开发、推荐书籍、软硬件基础)

废话不多说直接上思维导图&#xff01; 如果有觉得图片看不清楚的&#xff0c;有疑问的&#xff0c;可在评论区进行留言&#xff01; 群号&#xff1a; 228447240 嵌入式总括 嵌入式书籍推荐 嵌入式软件知识 嵌入式硬件知识 嵌入式应用开发 嵌入式驱动开发 嵌入式视频推荐: 韦…

WebSocket相关问题

1.WebSocket是什么&#xff1f;和HTTP的区别&#xff1f; WebSocket是一种基于TCP连接的全双工通信协议&#xff0c;客户端和服务器仅需要一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并且支持双向数据的传输。WebSocket和HTTP都是基于TCP的应用层协议&am…

【PyTorch][chapter 15][李宏毅深度学习][Neighbor Embedding-LLE]

前言&#xff1a; 前面讲的都是线性降维&#xff0c;本篇主要讨论一下非线性降维. 流形学习&#xff08;mainfold learning&#xff09;是一类借鉴了拓扑流行概念的降维方法. 如上图,欧式距离上面 A 点跟C点更近&#xff0c;距离B 点较远 但是从图形拓扑结构来看&#xff0c; …

书生·浦语大模型全链路开源体系

1&#xff0c;简述大模型的定义与特点&#xff1a; 大模型是指参数数量大于10亿的模型&#xff0c;它的特点包括&#xff1a;模型规模大&#xff0c;数据规模大&#xff0c;计算规模大和任务数量 2. 分析大模型成为通用人工智能的重要途径的原因&#xff1a; 大模型能够从大…

2023年的技术变革,我不是破坏大环境的人

文章目录 前言2023年的技术变革人工智能的崛起元宇宙的跌落物联网的渗入 技术变革的背后技术变革的影响积极的影响负面的影响 技术变革带来的思考 前言 2023无疑是一个充满变革和创新的一年&#xff0c;这背后离不开技术的发展和进步。不论是人工智能的崛起&#xff0c;还是元…

[word] word表格内容自动编号 #经验分享#微信#其他

word表格内容自动编号 在表格中的内容怎么样自动编号&#xff1f;我们都知道Word表格和Excel表格有所不同&#xff0c;Excel表格可以轻松自动编号&#xff0c;那么在Word表格中如何自动编号呢&#xff1f; 1、选中内容后&#xff0c;点击段落-自动编号&#xff0c;选择其中一…

数据结构——C/栈和队列

&#x1f308;个人主页&#xff1a;慢了半拍 &#x1f525; 创作专栏&#xff1a;《史上最强算法分析》 | 《无味生》 |《史上最强C语言讲解》 | 《史上最强C练习解析》 &#x1f3c6;我的格言&#xff1a;一切只是时间问题。 ​ 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特…

计算机缺失concrt140.dll怎么修复?分享5种有效的修复方法

在计算机系统运行过程中&#xff0c;如果发现无法找到“concrt140.dll”这个特定的动态链接库文件&#xff0c;可能会引发一系列问题和故障。首先&#xff0c;我们需要了解“concrt140.dll”是Microsoft Visual Studio中用于实现并行计算框架的重要组件&#xff0c;它的缺失会导…

HarmonyOS 鸿蒙应用开发(十、第三方开源js库移植适配指南)

在前端和nodejs的世界里&#xff0c;有很多开源的js库&#xff0c;通过npm(NodeJS包管理和分发工具)可以安装使用众多的开源软件包。但是由于OpenHarmony开发框架中的API不完全兼容V8运行时的Build-In API&#xff0c;因此三方js库大都需要适配下才能用。 移植前准备 建议在适…

RabbitMQ的延迟队列实现[死信队列](笔记二)

上一篇已经讲述了实现死信队列的rabbitMQ服务配置&#xff0c;可以点击: RabbitMQ的延迟队列实现(笔记一) 目录 搭建一个新的springboot项目模仿订单延迟支付过期操作启动项目进行测试 搭建一个新的springboot项目 1.相关核心依赖如下 <dependency><groupId>org.…

Linux | 进度条 | Linux简单小程序 | 超级简单 | 这一篇就够了

进度条—实例示范 在学习了基本的Linux指令&#xff0c;Linux上vim编译器等等之后&#xff0c;我们就来学习写代码喽~ 今天就给大家详细讲解一下进度条的编写&#xff0c;需要的效果如下图&#xff1a; 进度条—必备知识 回车和换行 在我们学习编程语言中&#xff0c;经常…

【力扣 - 回文链表】

题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 提示&#xff1a; 链表中节点数目在范围[1, 100000] 内 0 < Node.val < 9 方法一&#xff1a;将值复制到数…

jsp教材管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 教材管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

网工内推 | 高级网工,IE认证优先,最高15K,五险一金

01 丰沃创新(北京)科技有限公司 招聘岗位&#xff1a;高级网络工程师 职责描述&#xff1a; 1. 主要负责移动营运商数据中心机房网络的维护工作&#xff1b; 2. 负责防火墙策略调整&#xff0c;负责交换机路由器等网络设备的配置&#xff1b; 3. 负责云专线的入网配置&#…

07:Kubectl 命令详解|K8S资源对象管理|K8S集群管理(重难点)

Kubectl 命令详解&#xff5c;K8S资源对象管理&#xff5c;K8S集群管理 kubectl管理命令kubectl get 查询资源常用的排错命令kubectl run 创建容器 POD原理pod的生命周期 k8s资源对象管理资源文件使用资源文件管理对象Pod资源文件deploy资源文件 集群调度的规则扩容与缩减集群更…

解析spritf和sscanf与模拟常用字符串函数strchr,strtok(二)

今天又来继续我们的字符串函数的文章&#xff0c;这也是最后一篇了。希望这两篇文章能让各位理解透字符串函数。 目录 strchr strtok sprintf和sscanf strchr strchr 是一个用于在字符串中查找特定字符首次出现位置的函数。以下是解析和模拟实现 strchr 函数的示例&…

缓存和分布式锁 笔记

概念 缓存的作用是减低对数据源的访问频率。从而提高我们系统的性能。缓存的流程图 缓存分类 本地缓存 把缓存数据存储在内存中(Map <String,Object>)&#xff0c;其实就是强引用&#xff0c;不会轻易被删除。 分布式缓存 数据冗余&#xff0c;效率不高 整合Redis &l…