当前位置: 首页 > article >正文

【蓝桥杯】日志统计

日志统计(编程题)https://dashoj.com/d/lqbproblem/p/53https://dashoj.com/d/lqbproblem/p/53https://dashoj.com/d/lqbproblem/p/53

题目

日志统计(编程题)

讲解

这个讲解感觉比较通俗易懂。

蓝桥杯2018年省赛B组08(c/c++)日志统计_哔哩哔哩_bilibili努力学习, 视频播放量 1641、弹幕量 0、点赞数 24、投硬币枚数 8、收藏人数 15、转发人数 3, 视频作者 昨晚梦到有鸽子落在你肩上, 作者简介 考研小朋友,相关视频:乘积最大 --蓝桥杯2018年c/c++B组10,分数 蓝桥杯2018年省赛c/c++A01,蓝桥杯2018 星期一,红客联盟真有那么神?83小时深搜保卫战揭秘,【蓝桥杯】学会暴力拿下省一!,2024.1.19第十四届蓝桥杯EDA省赛真题(作业评讲3),蓝桥杯基础算法:一维差分,蓝桥杯~三升序列,美国要把TP-LINK禁了,这事实在不知该从哪里吐槽,2025年了,我们应该如何看待C++语言?https://www.bilibili.com/video/BV19i4y1377m?vd_source=f93e63f88343133e9467ba52a1737210https://www.bilibili.com/video/BV19i4y1377m?vd_source=f93e63f88343133e9467ba52a1737210https://www.bilibili.com/video/BV19i4y1377m?vd_source=f93e63f88343133e9467ba52a1737210

题目描述

小明维护着一个程序员论坛。现在他收集了一份“点赞”日志,日志共有 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% 的数据,1≤K≤N≤1000。
  • 对于 100% 的数据,1≤K≤N≤10^5,0≤id,ts≤10^5

思路

双指针,滑动窗口,给id分组(按照时间从小到大的顺序)

使用pair数组分组,id虽然后输入,但要放在first,这样以id为优先排序

比如样例的

0 1  
0 10    
10 10  
10 1  
9 1
100 3  
100 3

按照id为first进行排序后

id  ts
1   0
1   9
1   10
3   100
3   100
10  0
10  10

通过循环得到每个id的begin和end,然后用自定义的judge函数进行判断这个id是否是热帖。

judge函数:核心是双指针

  • 双指针窗口初始化

    • 快指针i与慢指针j初始指向当前id的起始位置begin

    • sum记录窗口内有效点赞数,初始为0

  • 窗口滑动逻辑

    1. 窗口扩张:快指针i右移,sum++累计点赞数

    2. 阈值检测:当sum >= k时,检查窗口时间跨度p[i].y - p[j].y

      • 若时间差< d:满足热帖条件,直接返回true

      • 否则:慢指针j右移缩小窗口,sum--保持窗口大小

    3. 终止条件:快指针i超出当前id的end位置

  • 关键性质

    • 通过单调滑动窗口确保时间复杂度为O(n)

    • 依赖时间有序性(因预处理排序保证)

代码

#include<iostream>
#include<string>
#include<algorithm>

using namespace std;
const int N=1e5+5;
pair<int,int>p[N];

bool judge(int begin, int end);

#define x first
#define y second
int n,d,k;

int main() {

    cin>>n>>d>>k;
    for(int i=0;i<n;i++)
    {
        cin>>p[i].y>>p[i].x;//让后输入的id放到pair数组的first位置,这样排序时以id优先
    }
    sort(p,p+n);
    int i=0;
    while(i<n)
    {
        int id=p[i].x;
        int begin=i,end;
        while(id==p[i].x&&i<n)//找到每组id的起始位置和终止位置
        {
            end=i;i++;
        }
        if(judge(begin,end))//对这个id进行判断是否为热帖
        {
            cout<<p[end].x<<endl;
        }
    }
    return 0;
}

bool judge(int begin, int end) {
    int i=begin,j=begin;
    int sum=0;
    while(j<=i&&i<=end)//使用双指针
    {
        sum++;
        if(sum>=k)
        {
            if(p[i].y-p[j].y<d)return true;
            else{
                sum--;j++;
            }
        }
        i++;
    }
    return false;
}

http://www.kler.cn/a/531407.html

相关文章:

  • Deepseek-R1 和 OpenAI o1 这样的推理模型普遍存在“思考不足”的问题
  • 【流媒体】搭建流媒体服务器
  • 解决PyG安装中torch-sparse安装失败问题:详细指南
  • w191教师工作量管理系统的设计与实现
  • python算法和数据结构刷题[1]:数组、矩阵、字符串
  • MiniQMT与xtquant:量化交易的利器
  • 2025年2月2日(tcp_server_socket.listen(128))
  • Vue指令v-on
  • 使用EVE-NG-锐捷实现RIP
  • 语言月赛 202412【顽强拼搏奖的四种发法】题解(AC)
  • 登录认证(5):过滤器:Filter
  • 【LeetCode】day11 206.反转链表
  • 【Elasticsearch】allow_no_indices
  • 深入剖析Electron的原理
  • pytorch卷积神经网络实现二分类
  • 数据结构与算法之栈: LeetCode 3100. 换水问题 II (Ts版)
  • WebSocket——环境搭建与多环境配置
  • 玩转Docker | 使用Docker部署SSCMS内容管理系统
  • 技术架构师成长路线(2025版)
  • vue.js学习笔记
  • ARM TEE
  • 蓝桥杯备考:前缀和算法---模板题
  • Clojure语言的文件操作
  • SSH笔记
  • c++提取矩形区域图像的梯度并拟合直线
  • fflush的概念和使用案例