以下摘要由GPT-4o生成: 小明在维护一个程序员论坛时,收集了一份关于帖子“点赞”的日志,日志包含 N 行数据,每行记录了某个时刻 ts 和帖子编号 id 的点赞情况。他希望统计出哪些帖子曾被认为是“热帖”,定义为在任意长度为 D 的时间段内至少收到 K 个赞。任务是根据给定的日志统计所有曾是“热帖”的帖子编号,并按从小到大的顺序输出这些编号。
题目:日志统计(第九届蓝桥杯省赛C++ B组)
小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有 N 行。
其中每一行的格式是:
1
ts id
表示在 ts 时刻编号 id 的帖子收到一个”赞”。
现在小明想统计有哪些帖子曾经是”热帖”。
如果一个帖子曾在任意一个长度为 D 的时间段内收到不少于 K个赞,小明就认为这个帖子曾是”热帖”。
具体来说,如果存在某个时刻 T 满足该帖在 [T,T+D) 这段时间内(注意是左闭右开区间)收到不少于 K 个赞,该帖就曾是”热帖”。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define x first #define y second usingnamespace std; typedef pair<int, int> PII; constint N = 100010;//十万数量级 PII logs[N];
int n, d, k; int cnt[N];//热帖 bool st[N]; intmain(){ cin >> 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]--; // 移出窗口的帖子计数减1,有可能有多个点赞,所以加循环 j++; // 左指针右移 } if (cnt[id] >= k) st[id] = true; } for (int i = 0; i <= 100010; i++) { if (st[i]) cout << i << endl; } return0; }