以下摘要由GPT-4o生成:
小明在维护一个程序员论坛时,收集了一份关于帖子“点赞”的日志,日志包含 N 行数据,每行记录了某个时刻 ts 和帖子编号 id 的点赞情况。他希望统计出哪些帖子曾被认为是“热帖”,定义为在任意长度为 D 的时间段内至少收到 K 个赞。任务是根据给定的日志统计所有曾是“热帖”的帖子编号,并按从小到大的顺序输出这些编号。

题目:日志统计(第九届蓝桥杯省赛C++ B组)

小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有 N 行。

其中每一行的格式是:

1
ts id  

表示在 ts 时刻编号 id 的帖子收到一个”赞”。

现在小明想统计有哪些帖子曾经是”热帖”。

如果一个帖子曾在任意一个长度为 D 的时间段内收到不少于 K个赞,小明就认为这个帖子曾是”热帖”。

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

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

输入格式

第一行包含三个整数 N,D,K。

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

输出格式

按从小到大的顺序输出热帖 id。

每个 id 占一行。

数据范围

1≤K≤N≤10^5,
0≤ts,id≤10^5,
1≤D≤10000

输入样例:

1
2
3
4
5
6
7
8
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3

输出样例:

1
2
1
3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 100010;//十万数量级
PII logs[N];

int n, d, k;
int cnt[N];//热帖
bool st[N];
int main (){

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;
}
return 0;
}

题目:未来竞赛(蓝桥杯16届模拟赛)

[5.未来竞赛(滑动窗口 and 二分)【算法赛】 - 蓝桥云课]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

const int MOD = 1e9 + 7;

int main() {
int N, D;
cin >> N >> D;

vector<int> A(N);
for (int i = 0; i < N; ++i) {
cin >> A[i];
}

// 统计每个国家的参赛者
unordered_map<int, vector<int>> countryToComputers;
for (int i = 0; i < N; ++i) {
countryToComputers[A[i]].push_back(i + 1); // 电脑编号从1开始
}

long long total = 1;

for (auto& [country, computers] : countryToComputers) {
int m = computers.size();
if (m == 0) continue;

// 计算每个国家的合法监控方式
long long ways = 1 + m; // 选择0台或1台电脑的方式

// 使用滑动窗口计算选择2台电脑的方式
int left = 0;
for (int right = 1; right < m; ++right) {
while (computers[right] - computers[left] > D) {
left++;
}
// 从left到right-1的电脑都可以与right配对
ways += (right - left);
}

total = (total * ways) % MOD;
}

// 减去全不选的情况
total = (total - 1 + MOD) % MOD;

cout << total << endl;

return 0;
}