原题链接 来自蓝桥云课
https://www.lanqiao.cn/problems/179/learning/
#include <bits/stdc++.h>
using namespace std;
map<int, int> mp;
set<int> st;
set<int>::iterator p;
pair<int, int> v[100100];
int work()
{
int i, j, t;
int n, d, k;
scanf("%d%d%d", &n, &d, &k);
for (i = 0; i < n; i++) scanf("%d%d", &v[i].first, &v[i].second);
sort(v, v+n);
int l = 0, r = 0;
while (r < n)
{
while (v[r].first - v[l].first < d && r < n)
{
mp[v[r].second]++;
if (mp[v[r].second] >= k)
{
st.insert(v[r].second);
}
r++;
}
while (v[r].first - v[l].first >= d)
{
mp[v[l].second]--;
l++;
}
}
for (p = st.begin(); p != st.end(); p++)
printf ("%d\n", *p);
return 0;
}
int main()
{
int T = 1;
//scanf("%d", &T);
while (T--) work();
return 0;
}
区间覆盖问题与滑动窗口
该代码实现了一个解决区间覆盖问题的算法,利用滑动窗口思路,维护一个集合st来存储满足条件的元素。输入包含n个区间,每个区间由开始和结束时间组成,目标是找出所有连续时间d内出现次数大于等于k的元素。算法首先对区间按开始时间排序,然后通过移动左边界l和右边界r来更新元素计数,并将符合条件的元素插入集合。最后输出集合中的所有元素。
1253

被折叠的 条评论
为什么被折叠?



