include[HTML_REMOVED]
include[HTML_REMOVED]
include[HTML_REMOVED]
include[HTML_REMOVED]
include[HTML_REMOVED]
include[HTML_REMOVED]
include[HTML_REMOVED]
include[HTML_REMOVED]
using namespace std;//双指针是用于求某一段是否满足要求的
const int N = 100010; //难点是要想到以时间段为条件解决问题,
typedef pair[HTML_REMOVED] PII;
define x first
define y second
int n, d, k;
int cnt[N];
bool st[N];
PII logs[N];
int main()
{
scanf(“%d %d %d”, &n, &d, &k);
for(int i = 0; i < n; i ++) scanf(“%d %d\n”, &logs[i].first, &logs[i].second);
sort(logs, logs + n);//默认就排第一个序号,以便后来的
for(int i = 0, j = 0; i < n; i ++)//双指针算法,i在前,j在后
{
int t = logs[i].second;
cnt[t] ++;
while(logs[i].first - logs[j].first >= d)//判断获赞是否超时
cnt[logs[j].second] --;//还原状态
j ++;
}
if(cnt[t] >= k) st[t] = true;
}
for(int i = 0; i < 100000; i ++)
{
if(st[i])
cout << i << endl;
}
return 0;
}
/大致意思,以i为指针,j为后指针,使[j,i]区间满足不超时的条件,
i的位置就是j(范围是[1,i])到i区间的所有可能情况,选取满足条件的情况,即[j,i]
满足不超时。
ts是限制条件,实际上起作用的是id,可类似于长度最小的子数组,sum>=target的作用
就类似于这里的logs[i].first - logs[j].first >= d,第三变量分别是sum,logs[i].first
/
/截取某一段满足的所有情况,一段长度是d。while循环就是截取片段的代码,截到满足条件
为止/