1238. 日志统计 双指针
Posted 幽殇默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1238. 日志统计 双指针相关的知识,希望对你有一定的参考价值。
1238. 日志统计 【双指针】
https://www.acwing.com/problem/content/1240/
#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
typedef pair<int,int> PII;
#define x first//时间
#define y second//id
const int N=100100;
PII P[N];
int cnt[N];
bool st[N];
int n,d,k;
int main(void)
{
cin>>n>>d>>k;
for(int i=0;i<n;i++) scanf("%d%d",&P[i].x,&P[i].y);
sort(P,P+n);//pair 会自动的按第一关键字排序,然后按第二关键字排序
int i,j;
for(i=0,j=0;i<n;i++)
{
int id=P[i].y;
cnt[id]++;
while(P[i].x-P[j].x>=d)//说明时间超过了
{
cnt[P[j].y]--;//将最开始的剔除掉
j++;//将下一个作为哨兵
}
if(cnt[id]>=k) st[id]=true;//是热贴
}
for(int i=0;i<=100050;i++)
if(st[i]) cout<<i<<endl;
return 0;
}
结构体写法:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int N=100100;
struct data
{
int id;
int t;
}Data[N];
bool cmp(data a,data b)
{
return a.t<b.t;
}
bool st[N];
int ct[N];
int n,d,k;
int main(void)
{
cin>>n>>d>>k;
for(int i=0;i<n;i++) scanf("%d%d",&Data[i].t,&Data[i].id);
sort(Data,Data+n,cmp);
int i,j;
for(i=0,j=0;i<n;i++)
{
int temp=Data[i].id;
ct[temp]++;
while(Data[i].t-Data[j].t>=d)
{
ct[Data[j].id]--;
j++;
}
if(ct[temp]>=k) st[temp]=true;
}
for(i=0;i<N;i++) if(st[i]) cout<<i<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=1e5+10;
int n,d,k,a[N];
vector<PII> ve;
map<int,int>mp;
int main(void)
{
cin>>n>>d>>k;
while(n--)
{
int t,id; cin>>t>>id;
ve.push_back({t,id});
}
sort(ve.begin(),ve.end());
for(int i=0,j=0;i<ve.size();i++)
{
a[ve[i].second]++;
while(ve[i].first>=ve[j].first+d)
{
a[ve[j].second]--,j++;
}
if(a[ve[i].second]>=k) mp[ve[i].second]++;
}
for(auto i=mp.begin();i!=mp.end();i++) cout<<i->first<<endl;
return 0;
}
以上是关于1238. 日志统计 双指针的主要内容,如果未能解决你的问题,请参考以下文章