如果不排顺序的话,那么还得遍历n方,所以复杂度通过sort减少很多。所以这也是双指针排序思想的理解。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100005;
bool sure[N];
struct Date{
int t;
int id;
};
bool cmp(Date a, Date b){ //使双指针按重要顺序排列,以便下文的 j-i能表示在规定时间内的赞
if(a.id==b.id) return a.t<b.t;
return a.id<b.id;
}
int main()
{
int n,d,k;
int t,id;
int count=0;
cin>>n>>d>>k;
Date a[N];
for(int i=0;i<n;i++){
cin>>t>>id;
a[i]={t,id};
}
sort(a,a+n,cmp);
for(int i=0,j=0;i<n;){
while(j<n&&a[j].id==a[i].id&&a[j].t-a[i].t<d){
j++;
}
if(j-i>=k){
//cout<<a[i].id<<"\n"; //注意的是如果这里是cout<<a[j].id<<"\n"; 那么答案是错的
sure[a[i].id]=true; //这是另一种输出方法,不过不是AC,只有85%;
}
if(a[i].id!=a[j].id){
i=j;
}
else i++;
}
for(int i=0;i<N;i++){
if(sure[i])
cout<<i<<"\n";
}
return 0;
}