题意:
给定n个在ts时刻获得一次点赞的帖子id,问在连续时刻[T, T + D]范围内被点赞数不少于K的帖子id。
最后按帖子id从小到大输出。
题解:
典型的固定大小窗口问题,只需要用双指针移动即可。
每次先将当前左指针所指的时刻被点赞的帖子id的点赞取消,然后右移左指针,
之后再右移右指针,再将当前右指针所指时刻被点赞的帖子id加上相应的点赞。
只需统计是否存在某个时间段为热帖则用开个数组记录下即可。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int cnt[N];
struct Node{
int ts, id;
bool operator < (const Node &A) const {
return ts < A.ts;
}
}p[N];
bool ok[N];
int n, K, D;
int main()
{
scanf("%d%d%d", &n, &D, &K);
for(int i = 1; i <= n; i++) scanf("%d%d", &p[i].ts, &p[i].id);
sort(p + 1, p + 1 + n);
int nowl = 1, nowr = 1;
int l = 0, r = -1;
while(r - 1 < p[n].ts) {
++r;
while(r - l + 1 > D) {
while(nowl <= n && p[nowl].ts == l) --cnt[p[nowl].id], ++nowl;
++l;
}
while(nowr <= n && p[nowr].ts == r) {
++cnt[p[nowr].id];
if(cnt[p[nowr].id] >= K) ok[p[nowr].id] = true;
++nowr;
}
}
for(int i = 0; i < N; i++)
if(ok[i]) printf("%d\n", i);
、
return 0;
}