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

题目概述

小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有 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.hqwc.cn/news/459729.html

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

相关文章

Unity2D 学习笔记 0.Unity需要记住的常用知识

Unity2D 学习笔记 0.Unity需要记住的常用知识 前言调整Project SettingTilemap相关&#xff08;创建地图块&#xff09;C#脚本相关程序运行函数private void Awake()void Start()void Update() Collider2D碰撞检测private void OnTriggerStay2D(Collider2D player)private void…

Sublime Text 3配置 Node.js 开发环境

《开发工具系列》 Sublime Text 3配置 Node.js 开发环境 一、引言二、主要内容2.1 初识 Sublime Text 32.2 初识 Node.js2.3 接入 Node.js2.3.1 下载并安装 Node.js2.3.2 环境变量配置 2.4 配置 Node.js 开发环境2.5 编写 Node.js 代码2.6 运行 Node.js 代码 三、总结 一、引言…

大数据术语系列(1)——COW和MOR,我如何使用chatgpt通俗易懂地理解了hudi这两种表类型

从传统数据库到大数据的转变&#xff0c;首当其冲的是各种术语的理解。 所以我与chatgpt发生了一系列对话&#xff0c;以便于我能快速理解这些术语。 我先把汇总的结果放在前边&#xff0c;后边会一步步地来说明我是如何获取这些信息的。前边我也发过一些关于chatgpt提示词相…

基于hadoop+spark的大规模日志的一种处理方案

概述: CDN服务平台上有为客户提供访问日志下载的功能,主要是为了满足在给CDN客户提供服务的过程中,要对所有的记录访问日志,按照客户定制的格式化需求以小时为粒度(或者其他任意时间粒度)进行排序、压缩、打包,供客户进行下载,以便进行后续的核对和分析的诉求。而且CDN…

Vulnhub靶机:hacksudoLPE

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;hacksudoLPE&#xff08;10.0.2.47&#xff09; 目标&#xff1a;获取靶机root权限和flag&#xff0c;该靶机是一个练习提权的靶场&#xff0c;主要以提…

【Linux】POSIX信号量基于环形队列的生产消费模型

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 引入1. POSIX信号量1.1 信号量的概念1.2 信号量的使用1.2.1 信号量的初始化1.2.2信号…

Ps:信息面板选项

点击“信息”面板控制菜单按钮&#xff0c;打开“信息面板选项” Info Panel Options对话框。 第一颜色信息 First Color Readout 指定在“信息”面板中的“第一颜色信息”区域显示的像素颜色值所基于的颜色模式。 模式 Mode --实际颜色 Actual Color 默认选项。显示在当前颜色…

什么是网络渗透,应当如何防护?

什么是网络渗透 网络渗透是攻击者常用的一种攻击手段&#xff0c;也是一种综合的高级攻击技术&#xff0c;同时网络渗透也是安全工作者所研究的一个课题&#xff0c;在他们口中通常被称为"渗透测试(Penetration Test)"。无论是网络渗透(Network Penetration)还是渗透…

Open CASCADE学习|创建多段线与圆

使用Open CASCADE Technology (OCCT)库来创建和显示一些2D几何形状。 主要过程如下&#xff1a; 包含头文件&#xff1a;代码首先包含了一些必要的头文件&#xff0c;这些头文件提供了创建和显示几何形状所需的类和函数。 定义变量&#xff1a;在main函数中&#xff0c;定义…

seata安装部署手册

1. 准备介质 seata-server-1.5.2.tar.gz2. 解压 tar-xzvf seata-server-1.5.2.tar.gz3. 创建数据库 数据库脚本位置&#xff1a;seata/script/server/db 4. 修改配置文件 bin目录 ---> 运行脚本 conf目录 ---> 配置文件 lib目录 ---> 依赖库 logs目录 ---> …

网神 SecGate 3600 防火墙 route_ispinfo_import_save 文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

codemirror光标样式问题

输入框为空时会显示placeholder&#xff0c;文字有点长换行了&#xff0c;光标竟然变成上图那样了&#xff0c;我试过如果placeholder文字是三行&#xff0c;那么光标就是三行高。真是见了鬼了。查到最后&#xff0c;原因竟然是因为我在用vue-codemirror时为了去掉一些basicSet…