球球各位给蒟蒻一个免费的赞
这里附上暴力做法和滑动窗口优化的方法
这题的主要细节是滑动窗口,但这题的最巧妙的地方在于排序
如果是传统的直接用滑动窗口难免无从下手,难点在每个店铺的热度的判定都对应一个起始时间和结束时间,难道开多个滑动窗口吗?排序为我们很好的解决了这一点,下面具体看代码分析
先看优化,暴力可以看下面
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define int long long
#define x first
#define y second
using namespace std;
typedef pair <int,int> PII;
const int N=1e5+10;
int cnt[N];
bool st[N];
PII a[N];
int b[N];
int hh=0,tt=-1;
int n,d,k1;
bool cmp(PII a,PII b){
return a.x<b.x;
}
signed main(){
cin>>n>>d>>k1;
for(int i=1;i<=n;i++){
int ts,id;
cin>>ts>>id;
a[i]={ts,id};
}
sort(a+1,a+1+n,cmp);
for(int i=1,j=1;i<=n;i++){
int id=a[i].y;
cnt[id]++;
while(a[i].x>=a[j].x+d){
cnt[a[j].y]--;
j++;
}
if(cnt[id]>=k1)st[id]=true;
}
for(int i=1;i<=1e5;i++)if(st[i]==true)cout<<i<<endl;
return 0;
}
暴力啦,我是最简单实现的暴力了,过了7个样例
#include<iostream>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int N=1e5+10;
int a[N],b[N];
int c[N];
bool st[N];
int h[N],e[N],ne[N],idx,cnt;
int n,d,k1;
signed main(){
cin>>n>>d>>k1;
int tm=0;
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++){
int t,id;
cin>>t>>id;
e[idx]=id;
ne[idx]=h[t];
h[t]=idx++;
tm=max(tm,t);
}
for(int i=0;i<=tm+1;i++){
memset(a,0,sizeof a);
for(int j=i;j<i+d&&j<=tm;j++){
for(int k=h[j];k!=-1;k=ne[k]){
int m=e[k];
a[m]++;
if(a[m]>=k1&&!st[m]) {c[cnt++]=m,st[m]=true;}
}
}
}
sort(c,c+cnt);
for(int i=0;i<cnt;i++) cout<<c[i]<<endl;
return 0;
}