AcWing 1238. 日志统计
原题链接
中等
作者:
满目星河_0
,
2021-03-30 23:55:13
,
所有人可见
,
阅读 232
双指针(超详细)
//算法思想:利用双指针i,j,确保指针i,j之间的距离总是k-1.再根据已知条件进行判断。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=1e5+10;
typedef pair<int,int> PII;
PII a[N];
int n,d,k;
int main(){
cin>>n>>d>>k;
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].second,&a[i].first);
//由于是按照用户的姓名升序排列,pair类型默认按照字典序排列,所以先输入second
}
sort(a,a+n);//按照用户的姓名升序排列
int i=0;
int j=i+k-1;//确保i与j之间的距离是k-1
int tem=-1;//tem的作用是避免输出重复元素
while(j<n){
if((a[j].second-a[i].second<d)&&(a[i].first==a[j].first))
{//满足以上两个约束条件
if(a[i].first!=tem){ //如果遇上一个输出的元素不同,就输出当前元素
cout<<a[i].first<<endl;
tem=a[i].first;
i=j+1;
j=i+k-1;
continue;
}
}
i++;j++;//i,j指针同时右移
}
return 0;
}