题目
题解
贪心,尺取。
首先按照时间从小到大,对输入的每一组 t s ts ts和 i d id id进行排序;
遍历每一对,取当前这对的
t
s
ts
ts作为题目中的
T
T
T,让另一个指针不断地向前走,直到指针所指的对的
t
s
ts
ts大于等于了
T
+
D
T+D
T+D就停止向前走,指针所经过的全部对的
i
d
id
id都在
[
T
,
T
+
D
)
[T,T+D)
[T,T+D)内,所以用cnt[i]
表示第i
个文章在
[
T
,
T
+
D
)
[T,T+D)
[T,T+D)内被点赞的数量,如果数量大于
K
K
K,则说明找到一个答案;指针到头了,我们的遍历就可以再进一步了,再以下一个对的
t
x
tx
tx为
T
T
T重复,注意当指针走完之后,遍历进一步之前,时间起点要后移了,所以要把遍历到的这个文章移出去,也就是cnt
要减少。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n, D, K, cnt[N];
vector <int> ans;
struct node {
int ts, id;
} a[N];
bool cmp (node a, node b) {
return a.ts < b.ts;
}
int main()
{
cin >> n >> D >> K;
for (int i = 0;i < n;i ++) cin >> a[i].ts >> a[i].id;
sort (a, a+n, cmp);
for (int i = 0, j = 0;i < n;i ++) {
while (j < n && a[j].ts - a[i].ts < D) {
int p = a[j].id;
cnt[p] ++;
if (cnt[p] >= K) ans.push_back (p);
j ++;
}
cnt[a[i].id] --;
}
sort (ans.begin(), ans.end());
cout << ans[0] << endl;
for (int i = 1;i < ans.size ();i ++)
if (ans[i] != ans[i-1]) cout << ans[i] << endl;
return 0;
}