题目:1238. 日志统计
思路1:用的是优先队列+双栈
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+10;
const int mod=100000007;
int n,d,k;
priority_queue<int ,vector<int >,greater<int >> q[N];
int main(){
cin>>n>>d>>k;
int x,y;
for(int i=0;i<n;i++){
scanf("%d%d",&x,&y);
q[y].push(x);
}
for(int i=0;i<=100000;i++){
if(q[i].size()<k) continue;
bool flag=0;
int t[N];
int f=0,r=-1;
while(q[i].size()){
t[++r]=q[i].top();
if((q[i].top()-t[f])>=d){
f++;
}
if(r-f+1>=k){
flag=1;
break;
}
q[i].pop();
}
if(flag){
printf("%d\n",i);
}
}
return 0;
}
思路2:双指针
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int >PII;
const int N=1e5+10;
const int mod=100000007;
int n,d,k;
PII p[N];
int a[N];
bool sta[N];
int main(){
cin>>n>>d>>k;
for(int i=0;i<n;i++){
scanf("%d%d",&p[i].first,&p[i].second);
}
sort(p,p+n);
for(int i=0,j=0;j<n;j++){
a[p[j].second]++;
while(p[j].first-p[i].first>=d){
a[p[i].second]--;
i++;
}
if(a[p[j].second]>=k) sta[p[j].second]=1;
}
for(int i=0;i<=100000;i++){
if(sta[i])printf("%d\n",i);
}
return 0;
}