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;
}
posted @ 2023-06-17 11:13  5k_sync_closer  阅读(2)  评论(0编辑  收藏  举报  来源