P8661 [蓝桥杯 2018 省 B] 日志统计 题解
别的题解好像都带 $\log$,来个 $O(n)$ 的。
扫描时间轴,对当前时间 $i$ 维护 $(i-d,i]$ 时刻每个帖子 $j$ 的获赞数 $c_j$。
维护 $v_i$ 表示 $i$ 时间获赞的帖子,扫描到 $i$ 时刻时 $\forall j\in v_{i-d},c_j\gets c_j-1$,然后 $\forall j\in v_i,c_j\gets c_j+1$,边加边统计 $c_j\ge k$ 的 $j$。
#include <cstdio>
#include <vector>
using namespace std;
int n, d, k, c[100050];
bool b[100050];
vector<int> v[100050];
int main()
{
scanf("%d%d%d", &n, &d, &k);
for (int i = 1, x, y; i <= n; ++i)
scanf("%d%d", &x, &y), v[x].push_back(y);
for (int i = 0; i <= 1e5; ++i)
{
if (i >= d)
for (auto j : v[i - d])
--c[j];
for (auto j : v[i])
if (++c[j] >= k)
b[j] = 1;
}
for (int i = 0; i <= 1e5; ++i)
if (b[i])
printf("%d\n", i);
return 0;
}