[蓝桥杯 2018 省 B] 日志统计——双指针算法

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: [蓝桥杯 2018 省 B] 日志统计——双指针算法

题目描述

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


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


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


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


输入格式

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

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

输出格式

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

输入输出样例

输入

7 10 2

0 1

0 10

10 10

10 1

9 1

100 3

100 3


输出

1

3

说明/提示

对于 50% 的数据,1≤KN≤1000。

对于 100% 的数据, 10^51≤KN≤10^5, 0≤id,ts≤10^5。

时限 1 秒, 256M。蓝桥杯 2018 年第九届省赛

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 100010;
int n, d, k;
PII logs[N];
int cnt[N];
bool st[N];  //记录每个帖子是否是热贴
int main()
{
    scanf("%d %d %d", &n, &d, &k);
    for (int i = 0; i < n; i++)
    {
        scanf("%d %d", &logs[i].x, &logs[i].y);
    }
    sort(logs, logs + n);
    for (int i = 0, j = 0; i < n; i++)
    {
        int id = logs[i].y;
        cnt[id]++;
        while (logs[i].x - logs[j].x >= d)
        {
            cnt[logs[j].y]--;
            j++;
        }
        if (cnt[id] >= k) st[id] = true;
    }
    for (int i = 0; i <= 100000; i++)
    {
        if (st[i])
        {
            cout << i << endl;
        }
    }
    return 0;
}


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
算法 索引 容器
双指针算法详解
本文介绍了双指针算法及其应用。双指针算法是在数组或字符串中常用的高效技术,通过维护两个指针遍历数据结构以解决特定问题。根据指针移动方向,可分为同向双指针、相向双指针和快慢指针。同向双指针如移动零和复写零问题;快慢指针如快乐数问题;相向双指针如盛水最多的容器、有效三角形数量及多数之和等问题。通过合理运用双指针技巧,可简化代码并提高效率。
60 4
双指针算法详解
|
1月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
1月前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
|
3月前
|
算法 关系型数据库 程序员
第一周算法设计与分析:A : log2(N)
这篇文章介绍了解决算法问题"输入一个数N,输出log2N(向下取整)"的三种编程思路,包括使用对数函数和幂函数的转换方法,以及避免浮点数精度问题的整数逼近方法。
|
4月前
|
运维
系统日志使用问题之如何防止在打印参数时遇到NPE(空指针异常)
系统日志使用问题之如何防止在打印参数时遇到NPE(空指针异常)
|
3月前
|
算法 容器
【算法】双指针
【算法】双指针
|
3月前
|
算法 C++ 容器
【C++算法】双指针
【C++算法】双指针
|
3月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
44 0
|
4月前
|
存储 算法 缓存
高并发架构设计三大利器:缓存、限流和降级问题之使用RateLimiter来限制操作的频率问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之使用RateLimiter来限制操作的频率问题如何解决