AcWing 1238. 日志统计(双指针与暴力)
原题链接
中等
作者:
qiao
,
2022-01-23 19:26:37
,
所有人可见
,
阅读 42
C++ 代码
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int, int> PII;
const int N = 1e5 + 10;
PII logs[N];
int vis[N];
int cnt[N];
int main()
{
int n, d, k; cin >> n >> d >> k;
for (int i = 0; i < n; i++)
{
int ts,id; scanf("%d%d",&ts,&id);
logs[i] = { ts,id };
}
sort(logs, logs + n);
for (int i = 0, j = 0; j < n; j++)
{
int id = logs[j].y;
cnt[id]++;
//通过双指针优化至O(n)
//当区间大于题意时:减去最左侧区间直至符合题意
while (logs[j].x - logs[i].x + 1 > d)
{
cnt[logs[i].y]--;
i++;
}
if (cnt[id] >= k)vis[id] = 1;
//O(n^2)做法
/* for (int j = i; j < n; j++)
{
if (logs[j].x - logs[i].x + 1 > d)break;
if (logs[j].y == id)
{
cnt++;
if (cnt >= k)vis[logs[i].y] = 1;
}
}*/
}
for (int i = 0; i <= 100000; i++)if (vis[i])printf("%d\n", i);
}